Autor Zpráva
JurajIvanovic
Profil *
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
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 *
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 *
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
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
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.

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: