Autor Zpráva
petule
Profil *
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 *
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
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 *
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: