多对多组合

时间:2016-08-12 14:44:51

标签: mysql sql many-to-many

我有以下标准的多对多关系: http://sqlfiddle.com/#!9/43bd68/28/0

(简化版) - 我有产品1,它有类别1,2,3和产品2,类别为1,3。

我想要实现的是选择属于特定类别组合的产品。

说明一下:

  • 获取属于类别(1或2)且属于类别(3)的产品。这应该返回产品1和2
  • 获取属于类别(2)且属于类别(3)的产品。这应该只返回产品1

类别应该像"过滤器" - 这就是为什么我最初的想法是设置WHERE category IN (1, 2) AND category IN (3),但这不起作用,因为类别是一行的单个值。我想我需要类似" foreach产品然后在产品内部检查它是否有类别(1或2)并且有类别(3)"。

是否可以通过SQL查询实现此目的?

1 个答案:

答案 0 :(得分:1)

您可以使用如下查询:

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

要为第一种情况实现查询,您必须在HAVING子句中使用条件聚合:

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