Autor Zpráva
Cpk
Profil
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
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 *
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
ď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
Cpk hod někam strukturu tabulky včetně ukazkových dat.
Kajman_
Profil *
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
[#6] Kajman Chcem počet produktov, ktoré majú rovnakú farbu. (pr. torta, ktorá je čiarna a biela).

Testovaciu databázu s dátami: link
faktor
Profil *
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
[#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 *
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

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0