Autor | Zpráva | ||
---|---|---|---|
V_B Profil |
#1 · Zasláno: 25. 11. 2016, 13:56:35
Ahoj,
mám tabulku v mysql databázi která obsahuje sloupce id, id_produktu, id_vlastnosti. Každý řádek má jednu vlastnost, která je definována číslem. Potřebuji vytvořit takový dotaz, který by mi vyplivnul produkty, které mají např. vlastnost 9 nebo 10 a současně vlastnosti 11 a 12 a také 14. Když v dotazu použiji danou tabulku vícektrát, tak je výsledek správný. Dotaz je ale hodně náročný na db, když je vlastností více. Neporadil byste někdo jak zoptimalizovat dotaz aby byl jen přes jednu tabulku? Dotaz: SELECT DISTINCT t.id_produkt FROM tabulka t, tabulka t1, tabulka t2, tabulka t3 WHERE t.id_produkt=t1.id_produkt AND t.id_produkt=t2.id_produkt AND t.id_produkt=t3.id_produkt AND ( t1.id_vlastnost IN(9,10) AND t2.id_vlastnost IN(11,12) AND t3.id_vlastnost IN(14) ) Díky za radu |
||
Kajman Profil |
Zkuste, zda nebude rychlejší něco takového
SELECT t.id_produkt FROM tabulka t JOIN (SELECT 1 podminka, 9 id_vlastnost FROM DUAL UNION ALL SELECT 1 podminka, 10 id_vlastnost FROM DUAL UNION ALL SELECT 2 podminka, 11 id_vlastnost FROM DUAL UNION ALL SELECT 2 podminka, 12 id_vlastnost FROM DUAL UNION ALL SELECT 3 podminka, 14 id_vlastnost FROM DUAL) p ON t.id_vlastnost = p.id_vlastnost GROUP BY t.id_produkt HAVING Count(DISTINCT p.podminka) = 3 |
||
TomášK Profil |
#3 · Zasláno: 26. 11. 2016, 00:21:45
Kajman
Spojuješ přes neexistující sloupec p.id_vlastnost , spravně má být myslím SELECT 1 podminka, 9 id_vlastnost FROM DUAL .
V_B Použitá struktura databáze je často považovaná za anti-pattern, viz en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model, www.root.cz/clanky/na-co-si-dat-pozor-pri-navrhu-databaze |
||
Kajman Profil |
#4 · Zasláno: 26. 11. 2016, 09:08:49
TomášK:
Díky, upraveno. |
||
V_B Profil |
#5 · Zasláno: 26. 11. 2016, 17:35:45
Díky za typ na dotaz i za odkaz na článek.
Dotaz pomoci JOIN jsem také zkoušel hned na začátku, ale časový výsledek byl hodně podobný. V případě několika parametrů mysql dotaz zvládne relativně rychle, ale když se dostane za nějakou hodnotu(větší počet parametrů) už nestačí RAM a dochází k velkému zpomalení, zřejmě mi tedy nezbude než předělat strukturu tabulky, na umístnění parametrů do sloupců, čemuž jsem se chtěl vyhnout, protože parametry jsou v každé kategorii hodně proměnlivé a dost často se mažou, přidávají a bude se tak dost často měnit počet sloupců v tabulce. Bohužel je to přesně tak jak se píše ve článku na rootu. |
||
Časová prodleva: 8 let
|
0