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
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
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