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: 9 let
|
0