Byl bych moc vděčný za pomoc s dotazem na db. Při použití "group by" potřebuji, aby z výsledné jedné skupiny vypsal ten nejnovější záznam a ne nejstarší, čili ten s nejvyšším id. DESC mi pouze přehodí opačně ty výsledky, ale ne záznamy v rámci jedné "group". Třeba je to blbost, ale moc byste mi tím pomohli, díky.
Dej sem ukázku dat a sql dotazu.
group by seskupuje údaje podel něčeho, pak jsou tam tzv group function (count(), max(), min(), ...)
No a tady je třeba použít tu správnou fci. Pokud budeš potřebovat daší informace z tohoto záznamu, bude asi potřeba udělat buď vnořený select, nebo něco podobného.
Nejhorší je, že už se v tom sám motám..
SELECT count(*) as pocet,
t_nazev,
MAX(datum) as datum,
z_autor,
f_tema.id as id_tema,
t_autor,
t_img,
nick
FROM f_zpravy, f_tema, user
WHERE f_zpravy.z_tema = f_tema.id AND f_zpravy.z_autor = user.id
GROUP BY id_tema, t_nazev
ORDER BY datum
DESC LIMIT 10
Mám 3 tabulky - seznam témat, zprávy v tématech a seznam uživatelů
Cílem je vypsat posledních 10 topiků v pořadí, jak do nich bylo naposledy napsáno včetně autora a času poslední zprávy.
Fungovat to mělo tak, že vybere všechny zprávy, seskupí po tématech, vybere nejvyšší čas zprávy ve skupině a jejího autora. Problém spočívá v tom, že sice vybere nejvyšší čas, ale pracuje pouze s hodnotou toho času, nikoliv s celym řádkem zprávy, která ten čas vlastní, ale zase s nejstaršim příspěvkem. Za zlý mu to nemám, hold dělá co se mu řekne:)
Já myslim, že by to vyřešilo otočit řazení řádků ještě před "group by" a to bych potřeboval zjistit jak.
S těmi vnořenými selecty nemám vůbec zkušenosti, takže nevim jak se započítává co do počtu dotazů. Snahou bylo to zredukovat na co nejmíň. Ten vnořený je jako pouze jeden navíc, nebo se vykonává s každým řádkem?
Ď
Jo a taky to jeste zjišťuje počet příspěvků v tématu. Funguje to až na maličkost, že seskupuje podle názvů témat, takže když se dva topiky jmenujou stejně, tak ty jejich příspěvky sečte. Tomu by asi pomohlo to seskupovat podle id témat, ale to mi nějak neběhalo, nebo sem se s tim také moc nezabýval. Jestli už to třeba neni na jeden dotaz moc.. :/
Je docela složité si představit spojení tří (cizích) tabulek, jejich spojení a třídění. Jediné co mě napadlo je, jestli není problém v tomto:
MAX(datum) as datum
Tím myslím, že tam máš dva údaje se stejným názvem "datum": původní datum ke každému řádku a následně MAX(datum). Zkus to přejměnovat třeba:
MAX(datum) as maxdatum ... ORDER BY maxdatum
Nebo:
MAX(datum) as maxdatum ... ORDER BY datum
Uvidíš, co to bude dělat.
Zapis "MAX(datum) as datum" nema vliv na chod dotazu. Klauzule AS pouze priradi alias pro vystup.
Ja bych tam pripojil "ORDER BY datum DESC" - razeni od nejvetsi po nejmensi.
Nejak mi tam nepasuje to MAX(datum). Mozna je to dobre, ale mne to nic nerika. Proste nevim k cemu. Nestaci jen datum?
Dale pouzivam pravidlo, ze pokud je uvedeno vice tabulek, tak kazdemu sloupci prirazuji i jeho odpovidajici tabulku - f_zpravy.t_nazev
>> Je docela složité si představit spojení tří (cizích) tabulek, jejich spojení a třídění.
Proc? Ja to pouzivam v eshopu. Jde jen o to, to spravne napojit a dat si pozor na integritu. Ten zbytek je hracka.
Tomík: zásadní je to slovo CIZÍCH. Když mám vlastní tabulky, tak běžně takovéto dotazy dělám. Ale jsou to moje tabulky a moje data. :-)