Autor | Zpráva | ||
---|---|---|---|
Cpk Profil |
#1 · Zasláno: 20. 11. 2011, 21:59:13 · Upravil/a: Cpk
Dobrý deň,
potreboval by som poradiť s SQL dotazom. Tabulka produkt má štruktúru: id_product | id_category | title Tabulka produkt_color má štruktúru: id_product | id_color Potrebujem vytiahnuť všetky produkty, ktoré majú priradenú danú farbu a sú v danej kategórii. SELECT count(*) FROM `product` p INNER JOIN `product_color` c ON (p.`id_product`=c.`id_product` AND c.`id_color`=3 -- AND c.`id_color`=4 uz vracia: 0 WHERE p.`id_category`=3 V prípade, že je v ON len jedna farba, tak všetko funguje OK, len ak pridám viac farieb tak už vracia nulový počet záznamov. Neviete ako upraviť daný dotaz aby súčasne fungoval aj pre viac farieb naraz? Dotaz je z dôvodu lepšieho pochopenia problému zjednodušený, ak by boli nejasnosti dovysvetlím, pripadne ho sem dám celý. ďakujem za rady. |
||
Kcko Profil |
#2 · Zasláno: 20. 11. 2011, 22:01:36
ON p.`id_product`=c.`id_product` AND ( c.`id_color`=3 OR c.`id_color`=4 OR c.`id_color`= 5 OR c.`id_color`= 6) |
||
faktor Profil * |
#3 · Zasláno: 20. 11. 2011, 22:22:53
Ahoj,
problem je, ze das do jedneho selectu viac joinov, tak ti zduplikuje vystupy a count ich vsetkych zrata aj ked uz su zduplikovane. uplne jednuduchym riesenim je nieco take cez subselect SELECT count(*) FROM ( SELECT p.id_product FROM product p INNER JOIN product_color c ON (p.id_product=c.id_product AND (c.id_color=3 OR c.id_color=4)) WHERE p.id_category=3 GROUP BY p.id_product) tab; -- tab je alias celeho vystupu urcite su aj elegantnejsie riesenia, najme ak naroky na db su vysoke, ale za beznych podmienok to postaci. faktor: „uplne jednuduchym riesenim je nieco take cez subselect“ Jednodušší mi přijde count(distinct p.`id_product`) Ale vzhledem k tomu, že Cpk tam možná dává and, protože potřebuje najít produkty mající obě barvy, tak ten poddotaz stejně bude potřeba (bude potřeba přidat having). |
||
Cpk Profil |
#4 · Zasláno: 20. 11. 2011, 22:37:00
ďakujem za komentáre a riešenia, ale ani jedno mi nefunguje.
[#3] faktor pr. pri podmienke (c.id_color=3 OR c.id_color=4) mi vracia 24 záznamov, (c.id_color=3 OR c.id_color=4 OR c.id_color=5) 77 |
||
Kcko Profil |
#5 · Zasláno: 20. 11. 2011, 22:38:09
Cpk hod někam strukturu tabulky včetně ukazkových dat.
|
||
Kajman_ Profil * |
#6 · Zasláno: 20. 11. 2011, 22:43:51
Cpk:
A hlavně vyjasněte, zda chcete počet produktů mající obě barvy nebo aslepoň jednu ze dvou barev. A ta poznámka pod čarou u [#3] je moje, něco tu špatně zafungovalo :-) |
||
Cpk Profil |
#7 · Zasláno: 20. 11. 2011, 23:04:59 · Upravil/a: Cpk
|
||
faktor Profil * |
#8 · Zasláno: 20. 11. 2011, 23:10:13
ano, jednoduchsie je urobit count(distinct p.id_product)....
ako napisal Kajman je rozdiel ak potrebujes produkt, ktory ma jednu z farieb, alebo vsetky tieto farby... v pripade ze potrebujes produkt ktory ma jednu z farieb tak select hore by mal fungovat. ak potrebujes aby mal vsetky farby tak: SELECT count(distinct p.id_product) as count FROM product p INNER JOIN product_color c ON (p.id_product=c.id_product AND c.id_color=4) INNER JOIN product_color pc ON (p.id_product=pc.id_product AND pc.id_color=3) --sem mozes pridat tolko JOINov kolko chces WHERE p.id_category=3 pripojis tu istu tabulku s inym aliasom... |
||
Cpk Profil |
#9 · Zasláno: 20. 11. 2011, 23:21:33
[#8] faktor Funguje, ďakujem. Tiež ma napadlo, že by sa to dalo riešiť dvoma nezávislými selectmi. V prvom by sa vybrali všetky vyhovujúce ID a tie by sa dali potom v druhom selecte do kauzule where id=? ... Ale toto je jednoduchšie a hlavne asi efektívnejšie.
Ďakujem za komentáre. |
||
Kajman_ Profil * |
#10 · Zasláno: 21. 11. 2011, 09:19:33
Při spojování s další tabulkou s každou barvou se může při přidávání počtu parametrů brzy narazit na limity. Univerzálnější bude
SELECT count(*) FROM (SELECT p.id_product FROM product p INNER JOIN product_color c ON p.id_product = c.id_product AND c.id_color in (3, 4) WHERE p.id_category = 3 GROUP BY p.id_product HAVING count(distinct c.id_color) = 2 -- pocet hledanych barev v zavorce ) tab |
||
Časová prodleva: 12 let
|
0