2016-12-09 83 views
0

我有這個數據庫設置:Mysql的許多一對多(凡)選擇

  • 產品

    • ID
    • [田...]
  • 標籤

    • id
    • [fields ...]
  • product_tag

    • ID
    • PRODUCT_ID
    • TAG_ID

如果我的數據庫中有這樣的記錄

  • 產品
    • 產品A [ID:1]
    • 產品B [ID:2]
    • 產品C [ID:3]

  • 標籤
    • 標籤A [ID:1]
    • 標籤B [ID:2]
    • 標籤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]

如何查詢得到已經TAG_ID 1和產品2(它必須由具有TAG_ID 1產品和2) 在這個例子中:「產品A」和「產品C」

+0

什麼是EAV? –

回答

0

使用此約這

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

@Neto [建議編輯](http://stackoverflow.com/review/suggested-edits/14572767)給你的回答,並被評論者拒絕。你不妨考慮自己改進它。 –

+0

我的表名錯誤,但我認爲OP應該改變他的表名。這種方式看起來更正確。 – CptMisery

+0

您是否碰巧知道「MariaDB不接受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

嗯...這可能只是比我的更好 – CptMisery

+0

我不知道標記ID的順序是否保證是'1,2'。 – cpburnz