Autor | Zpráva | ||
---|---|---|---|
petule Profil * |
#1 · Zasláno: 27. 6. 2009, 22:31:49
Zdravím,
v jedné tabulce mám články a v druhé mám fotky k článkům (1 článek má víc fotek). Potřebuji vybrat 5 nejnovějších článků a k nim hlavní fotku (to je ta, s nejnižším ID). Zatím to řeším takto: //vytahnu si clanky $sel_clanky = "SELECT `id_clanku`, `nazev` FROM `clanky`; $dot_clanky = mysql_query($sel_clanky); while ($row_clanky = mysql_fetch_array($dot_clanky)) { //pak k nim najdu fotku $sel_fotka = "SELECT `soubor` FROM `clanky_fotky` WHERE `id_clanku` = '" . $row_clanky["id_clanku"] . "' ORDER BY `vlozena` LIMIT 1;"; $dot_fotka = mysql_query($sel_fotka); $row_fotka = mysql_fetch_array($dot_fotka); ... } ale není to moc efektivní, ráda bych to spojil do jednoho dotazu, ale nevím jak. Poradí někdo? Napadlo mě to řešit pomocí LEFT JOIN, ale pokud má clánek 3 fotky, je ve výpisu 3-krát. SELECT DISTINCT(recept.id_receptu AS id_receptu), nazev, suroviny, postup, vlozen FROM recept LEFT JOIN recept_fotky ON recept.id_receptu = recept_fotky.id_receptu ORDER BY `vlozen` DESC LIMIT 5 Díky za nápady |
||
petule Profil * |
#2 · Zasláno: 27. 6. 2009, 22:36:44
Ten dotaz s tím LEFT JOIN má být bez DISTINCT, s ním to nefunguje vůbec.
SELECT recept.id_receptu AS id_receptu, nazev, suroviny, postup, vlozen FROM recept LEFT JOIN recept_fotky ON recept.id_receptu = recept_fotky.id_receptu ORDER BY `vlozen` DESC LIMIT 5 |
||
TomášK Profil |
#3 · Zasláno: 27. 6. 2009, 23:38:08 · Upravil/a: TomášK
Předpokládám, že ke každému receptu existuje alespoň jedna fotka:
SELECT recept.id_receptu, nazev, suroviny, postup, vlozen FROM recept JOIN recept_fotky AS foto1 ON recept.id_receptu = foto1.id_receptu LEFT JOIN recept_fotky AS foto2 ON foto1.id_receptu = foto2.id_receptu AND foto1.id > foto2.id WHERE foto2.id_receptu IS NULL ORDER BY `vlozen` DESC LIMIT 5 Pokud by některé články neměly fotku, je potřeba změnit první JOIN na LEFT JOIN. Snad v tom není zas nějaký překlep... |
||
petule Profil * |
#4 · Zasláno: 28. 6. 2009, 13:51:38
Díky za dotaz, funguje, ale mohl by jsi mi ho ještě nějak vysvětlit? Část
SELECT recept.id_receptu, nazev, suroviny, postup, vlozen FROM recept JOIN recept_fotky AS foto1 ON recept.id_receptu = foto1.id_receptu chápu, ale nechápu, proč je tam ten druhý LEFT JOIN a WHERE foto2.id_receptu IS NULL |
||
TomášK Profil |
#5 · Zasláno: 28. 6. 2009, 14:23:08
Obdobu toho dotazu i s alternativním řešením (asi i o něco čitelnějším) najdeš v dokumentaci - http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html
LEFT JOIN udělá to, že ke stávajícím záznamům připojí ještě jednou fotky, ale jen ty, které mají nižší id než je id fotky v záznamu. Pokud žádná fotka, která má nižší id není, pak se připojí řádek obsahující samé NULL hodnoty (protože používáme LEFT JOIN). A právě ty řádky chceme. |
||
Časová prodleva: 15 let
|
0