U takto jednoduchého příkladu se to dá omluvit, ale pokud to má být "ukázkový" příklad, pak je to naprostá trotlovina. Velké množství dotazů se používá na několika místech - jednou se ze stejných dat generuje třeba ceník pro internetového uživatele, podruhé se ze stejných dat generuje ceník pro prodejce, doplněný o možnosti změn. Pro podobné příklady bych použil zásadně VIEW. To je předem připravený dotaz, uložený přímo v databázi, a na všech místech programu poskytující pokaždé stejná data. Pokud se později provádějí změny do struktury tabulek, stačí opravit dotaz na jediném místě - v databázi - a do programů se promítnou změny bez zásahu programátorovy ruky.
Takže "odstrašující řešení" je skutečně odstrašující, "za určitých okolností přijatelné řešení" je odstrašující a nakonec "správné řešení" je v kontextu ukázkového příkladu taky odstrašující.
Vzorový příklad by měl vypadat v databázi takto:
CREATE VIEW vyrobky_view AS SELECT vyrobky.id, vyrobky.nazev, skupiny.nazev AS skupina_nazev FROM vyrobky INNER JOIN skupiny ON vyrobky.skupina = skupiny.id
a v PHP takto:
// správné řešení $result = mysql_query("SELECT * FROM vyrobky_view WHERE podminka"); while ($row = mysql_fetch_assoc($result)) { echo "<a href='?id=$row[id]'>$row[nazev]</a>" .($row[skupina_nazev])<br/>\n"; } mysql_free_result($result);
Pokud databáze MySQL nezvládá VIEW, pak by se na projekty, obsahující více než jednu tabulku, vůbec neměla používat.
Nevím, co máte přesně na mysli, ale u Firebirda mi
select ... from TBL1 A where (select count(*) from TBL2 B where B.COL2=A.COL1)=0
dá přesně totéž, co (podstatně vhodnější)
select ... from TBL1 A where not exists (select * from TBL2 B where B.COL2=A.COL1)
nebo
select ... from TBL1 A left join TBL2 B on B.COL2=A.COL1 where B.COL2 is null
a nedokážu si dost dobře představit, proč by měl být výsledek různý.
having count(*)=0
". Pak to samozřejmě nemůže fungovat, protože u left join
bude ve výsledku vždy minimálně jeden řádek a u inner join nebude sice žádný, ale pak taky nebude co dát do result set. Ale vaše původní tvrzení, že pomocí count(*) to nejde, není určitě pravdivé; jde to, jen se musí použít správně.
Můžete čtenáře odkázat např. na relevantní část dokumentace, která by dokazovala vaše tvrzení, že použitím klíčového slova JOIN se určuje pořadí, v jakém se joinuje? Např. v MySQL popisu JOIN je uvedeno:
STRAIGHT_JOIN is identical to JOIN, except that the left table is always read before the right table. This can be used for those (few) cases for which the join optimizer puts the tables in the wrong order.
Z toho mi vychází, že u normálního JOINu si databáze pořadí tabulek určí sama. Navíc si nemyslím, že by to byla nějaká MySQL-specifická věc.