2016-06-09 5 views
0

Ich habe ein Objekt Product das viele Tag s hat. Ich möchte eine Abfrage schreiben, die bei einer Liste von Tag IDs nur eine Product zurückgibt, wenn ALLE Tags des Produkts in der Eingabeliste enthalten sind. Die Eingabeliste kann Tag-IDs enthalten, die nicht Teil eines Produkts sind, aber das ist in Ordnung, das Produkt kann dennoch zurückgegeben werden (d. H. Alle Tags des Produkts müssen als Teilmenge der Eingabeliste vorhanden sein, die im Ergebnis enthalten sein soll).Wie man nur Ergebnisse einbezieht, wenn alle zugehörigen Werte in der Eingabeliste existieren

Ich konnte 1 Abfrage schreiben, um dies zu erreichen, aber ich würde wirklich gerne in der Lage sein, es ohne die Unterabfrage in der JOIN zu tun. Das ist, was ich habe:

SELECT * 
FROM product 
LEFT JOIN product_tag ON product_tag.product_id = product.id 
LEFT JOIN (
    SELECT product.id, COUNT(*) AS record_count 
    FROM product 
    LEFT JOIN product_tag ON product_tag.product_id = product.id 
    GROUP BY product.id 
) AS inner_q ON inner_q.id = product.id 
WHERE product_tag.id in (1, 2, 3) -- Sample Tag ids 
GROUP BY product.id 
HAVING COUNT(*) = inner_q.record_count 

Antwort

0

vkp führte mich in die richtige Richtung:

select * from product 
where id in 
(
select product_id 
from product_tag 
group by product_id 
having sum(case when id in (1, 2, 3) then 1 else 0 end) >= count(product_id) 
) 
1

Enthält diese Sie das gewünschte Ergebnis bekommen?

select * from product 
where id in 
(select product_id 
from product_tag 
group by product_id 
having sum(case when id in (1, 2, 3) then 1 else 0 end) >= 3) 
+0

Fast, aber die> = 3 (vermutlich die Zählung der Eingabeliste) macht es nicht funktionieren. Wenn ein Produkt nur 2 Tags hat (zB ID 1 und 2), würde es nicht enthalten sein, wenn es – Thelonias

+0

sein sollte. Deine Antwort hat mich auf den richtigen Weg gebracht, ich musste es nur optimieren, so dass die HAVING-Einschränkung speziell die Anzahl von war Alle Tags, die ein Produkt hat – Thelonias