Autor Zpráva
okolojdouci
Profil *
Mám hlavní tabulku inzerátů, mj. se sloupcem email. Potom mám druhou tabulku, kde jsou emaily. Potřeboval bych výpis všech inzerátů, jejichž email není obsažen v tabulce emailů.
Asi takto:
SELECT * FROM inzeraty WHERE email NOT IN (SELECT email FROM emaily)

Jednoduché a silně nehospodárné. Poradí někdo lepší postup než NOT IN?
Nejde o emaily a inzeráty, ale jde o řetězce a položek jsou tisíce, bohužel se to nedá jinak.
Tori
Profil
Jaký by byl EXPLAIN pro SELECT i.* FROM inzeraty i LEFT JOIN emaily e USING (email) WHERE e.email IS NULL ? Anebo poddotazem: SELECT i.* FROM inzeraty i WHERE NOT EXISTS (SELECT * FROM emaily e WHERE e.email = i.email)
Kajman
Profil
okolojdouci:
Plánovač mysql občas tyto poddotazy vyhodocuje pro každý řádek znovu. S tím left joinem problémy nebývají.
okolojdouci
Profil *
Tori:
Asi teď nebudu úplně za profíka, ale co je to "email" za USING? Mám tam název sloupce z té druhé tabulky, kde jsou ty "nechtěné" emaily a vrací mi to: Unknown column 'email' in 'from clause'


Kajman:
No a já tam těch tabulek mám stejnou logikou připojených 11, takže to je neúnosný, dotaz trvá kolem 15 sekund. V nové verzi už to bude jinak, ale teď to nemůžu zaživa překopat.
Tori
Profil
okolojdouci:
co je to "email" za USING?
SQL v [#1] jsem pochopila tak, že v tabulce inzeraty i emaily je sloupec email, na základě kterého se spojují. (A v případě, že se sloupeček v obou tabulkách jmenuje stejně, se dá místo ON t1.sloupec = t2.sloupec použít USING(sloupec).) Možná se ten sloupec jmenuje teda jinak, nevím.

Ještě v reakci na [#4] doplňuji [#2]: bylo by asi logičtější přehodit v tom mém joinu část WHERE do podmínky spojení tabulek: LEFT JOIN tabulka t2 ON t2.sloupec = t1.sloupec AND t2.sloupec IS NULL, když stejným způsobem připojujete víc tabulek.

Nechcete ukázat celý ten dotaz?

Kajman ↓:
A jo vlastně, děkuju za opravu.
Kajman
Profil
Tori:
bylo by asi logičtější přehodit v tom mém joinu část WHERE do podmínky spojení tabulek

To ne. To nikdy nic nepřipojí. Nemůže to být rovno a zároveň null.
okolojdouci
Profil *
Díky vám oběma. Už to funguje a je to znatelně rychlejší.

Tori:
USING jsem neznal, díky za rozšíření obzorů.

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: