| Autor | Zpráva | ||
|---|---|---|---|
| JurajIvanovic Profil * |
#1 · Zasláno: 11. 4. 2016, 17:56:48
Dobrý den,
aktuálně řeším jeden problém s propojením více tabulek. V tabulkách je přes 20 000 záznamů a tak potřebuji, aby byl příkaz optimalizovaný co nejlépe (načítal co nejrychleji) Jde mi o to, že vyhledávám produkty, které jsou zařazeny do různých kategorií, ale v jednom výpisu potřebuji jednu kategorii vyřadit. Tedy, vypadá to takto tabulky web_products (id,name,info,text,server,top, timesend..) web_products_category ( id, category_id, product_id ) web_products_servers (id, name ) příkaz: ID kategorie, od které nechci produkty zobrazovat je 28. Aktuálně mi to takto nefunguje a navíc to dlouho načítá :/ SELECT * FROM web_products produkty LEFT JOIN web_products_servers servers ON produkty.server != servers.name LEFT JOIN web_products_category ecat ON ecat.category_id != '28' WHERE top>200 GROUP BY slevy.id ORDER BY timesend DESC LIMIT 1, 200 |
||
| juriad Profil |
#2 · Zasláno: 11. 4. 2016, 18:16:12
V tom dotazu se odkazuješ na tabulku
slevy, kterou nikde nemáš definovanou. Navíc ty JOINy jsou skoro kartézké součiny, což je docela divné.
Buď napiš, co ten dotaz má dělat, nebo dodej správný SELECT. |
||
| JurajIvanovic Profil * |
#3 · Zasláno: 11. 4. 2016, 18:20:45
Mám tam slevy.id, má tam být produkty.id. To mám dobře, jen jsem to špatně napsal..
Potřebuji vytáhnout všechny produkty z tabulky web_products, ale produkt nesmí být zařazen v kategorii s ID 28. Každý produkt je zařazen ve více kategoriích. Navíc je tam left join na tabulku servers, která kontroluje, jestli server, ze kterého je produkt, není zablokovaný. |
||
| juriad Profil |
Dotaz, který chceš vypadá asi takto:
SELECT wp.* # chceme vrátit jen hodnoty z tabuky produktů; FROM web_products wp # tabulku produktů LEFT JOIN web_products_servers wps ON wp.server = wps.name # provážeme se serverem podle názvu LEFT JOIN web_products_category wpc ON wp.id = wpc.product_id AND wpc.category_id = 28 # a s kategorií číslo 28; # zajímají nás jen takové produkty, u kterých WHERE wpc.id IS NULL # se nepodařilo najít server podle jména, AND wps.id IS NULL # se nepodařilo najít napojení na kategorii 28, AND top > 200 # je navíc splněna podmínka na top; # protože výše uvedené podmínky garantují, že LEFT JOINy nepřipojí úspěšně nic (řádek bude obsahovat samé NULL), není GROUP BY nutný ORDER BY timesend DESC LIMIT 0, 200 # asi chceš zobrazit prvních 200 záznamů, tedy přeskočit 0 záznamů. |
||
| JurajIvanovic Profil * |
#5 · Zasláno: 11. 4. 2016, 18:45:31
Podobně to mám u kategorie, ale jak jsem psal -> NESMÍ být zařazen v kategorii s ID 28 tak se mě to začlo dlouho načítat
|
||
| juriad Profil |
#6 · Zasláno: 11. 4. 2016, 18:47:33
Ale vždyť to ten můj dotaz dělá. Zkusí připojit kategorii 28, a pak ve WHERE podmínce zkusí, jestli se to nepodařilo (NULL).
|
||
| Kajman Profil |
#7 · Zasláno: 11. 4. 2016, 22:19:42
JurajIvanovic:
Pokud je produkt ve více kategoriích a jednou z nich je 28, má se zobrazit? Pokud není produkt v žádné kategorii, má se zobrazit? Při odpovědi Ne a Ano, by mělo být dotaz z [#4] správně. Pokud je výsledek správný, ale pomalý, pošlete sem ještě popis indexů, které máte nad tabulkami vytvořené a explain dotazu. |
||
|
Časová prodleva: 10 let
|
|||
0