2016-08-12 2 views
0

Ich habe folgende Standard-many-to-many-Beziehung: http://sqlfiddle.com/#!9/43bd68/28/0Many-to-many-Kombinationen

(vereinfachte Version) - Ich habe Produkt 1, die 2 Kategorien 1, 2, 3 und Produkt hat , die Kategorien 1, 3 hat.

Was ich versuche zu erreichen, ist die Produkte auszuwählen, die zu bestimmten Kombination von Kategorien gehören.

es illustrieren:

  • Get Produkte, die zu den Kategorien gehören (1 oder 2) und zu den Kategorien (3) gehören. Dies sollte beide Produkte 1 und 2 zurückgeben
  • Holen Sie sich Produkte, die zu Kategorien (2) gehören und zu Kategorien (3) gehören. Dies sollte nur Produkt 1

Die Kategorien zurückgeben sollten wie „Filter“ verhalten - das ist, warum mein erster Gedanke zu setzen WHERE category IN (1, 2) AND category IN (3) war, aber das funktioniert nicht, da die Kategorie ein einzelner Wert für eine Zeile ist. Ich denke, ich brauche etwas wie "foreach Produkt und dann innerhalb des Produkts überprüfen, ob es Kategorie (1 oder 2) und Kategorie (3) hat".

Ist es möglich, dies mit einer SQL-Abfrage zu erreichen?

Antwort

1

Sie eine Abfrage wie die folgend verwenden:

SELECT 
    p.name as prodName, p.id as pid 
FROM 
    Product p 
JOIN Category_Product cp ON p.id = cp.product_id 
JOIN Category c ON c.id = cp.category_id 
WHERE category_id IN (2,3) 
GROUP BY pid 
HAVING COUNT(*) = 2 

Demo here

Um eine Abfrage für den ersten Fall implementieren Sie ein bedingtes Aggregat in HAVING Klausel verwenden:

SELECT 
    p.name as prodName, p.id as pid 
FROM 
    Product p 
JOIN Category_Product cp ON p.id = cp.product_id 
JOIN Category c ON c.id = cp.category_id 
WHERE category_id IN (1,2,3) 
GROUP BY pid 
HAVING COUNT(CASE WHEN category_id IN (1,2) THEN 1 END) > 0 AND 
     COUNT(CASE WHEN category_id = 3 THEN 1 END) >= 1 

Demo here

+0

Vielen Dank für die schnelle Antwort. Könnten Sie mir bitte ein Beispiel für den ersten Fall nennen - "Kategorie IN (1,2) UND Kategorie IN (3)"? – o15a3d4l11s2

+0

@ o15a3d4l11s2 Bitte überprüfen Sie die Änderung, die ich gemacht habe. –