多对多组合

Many-to-many combinations

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

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

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

举例说明:

类别的行为应类似于 "filters" - 这就是为什么我最初的想法是设置 WHERE category IN (1, 2) AND category IN (3),但这不起作用,因为类别是一行的单个值。我想我需要像 "foreach product and then inside the product check if it has category (1 or 2) and has category(3)".

这样的东西

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

您可以使用如下查询:

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