2016-12-09 2 views
0

ich diese Datenbank eingerichtet haben:Mysql Many-to-many (und wo) wählen

  • Produkte

    • id
    • [Felder ...]
  • Tags

    • id
    • [Felder ...]
    • ]
  • product_tag

    • id
    • product_id
    • tag_id

Wenn diese Datensätze in der Datenbank

  • Produkte
    • Produkt A [ID: 1]
    • Produkt B [id: 2]
    • Produkt C [id: 3]

  • Tags
    • Tag A [ID: 1]
    • Tag B [id: 2]
    • Tag C [id: 3]

  • Produc_Tag
    • [product_id : 1, tag_id: 1]
    • [product_id: 1, tag_id: 2]
    • [product_id: 2, tag_id: 1]
    • [product_id: 2, tag_id: 3]
    • [product_id: 3, tag_id: 1]
    • [product_id: 3, tag_id: 2]

Wie kann ich abfragen, um die Produkte zu erhalten, die tag_id hat 1 und 2 (durch Produkte mit tag_id muss 1 und 2) in diesem Beispiel: "Produkt A" und "Produkt C"

+0

Was ist EAV über diese? –

Antwort

0

verwenden

SELECT P.id 
FROM products P 
INNER JOIN products_tags PT ON PT.product_id = P.id 
WHERE PT.tag_id IN (1,2) 
GROUP BY P.id 
HAVING COUNT(PT.*) = 2 
+0

@Neo [schlug eine Änderung vor] (http://stackoverflow.com/review/suggested-edits/14572767) zu Ihrer Antwort, die von den Rezensenten abgelehnt wurde. Vielleicht möchten Sie es selbst verbessern. –

+0

Ich habe den Tabellennamen falsch gelesen, aber ich denke, OP sollte seinen Tabellennamen ändern. Sieht auf diese Weise richtiger aus. – CptMisery

+0

Wissen Sie etwas über das Problem "MariaDB akzeptiert' COUNT (PT. *) '"? –

0
SELECT * 
FROM products 
WHERE id IN (
    SELECT product_id 
    FROM product_tag 
    GROUP BY product_id 
    HAVING GROUP_CONCAT(tag_id) = '1,2' 
) 
+0

hmm ... Das könnte einfach besser sein als meine – CptMisery

+0

Ich weiß nicht, ob die Reihenfolge der Tag-IDs garantiert "1,2" ist. – cpburnz