Autor | Zpráva | ||
---|---|---|---|
okolojdouci Profil * |
#1 · Zasláno: 13. 2. 2012, 03:39:18
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 * |
#4 · Zasláno: 13. 2. 2012, 10:02:58 · Upravil/a: okolojdouci
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.
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 |
#6 · Zasláno: 13. 2. 2012, 11:31:39
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 * |
#7 · Zasláno: 13. 2. 2012, 21:03:28
Díky vám oběma. Už to funguje a je to znatelně rychlejší.
Tori: USING jsem neznal, díky za rozšíření obzorů. |
||
Časová prodleva: 11 let
|
0