【问题标题】:Many-to-many combinations多对多组合
【发布时间】:2016-08-12 14:44:51
【问题描述】:

我有以下标准的多对多关系: 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 查询来实现这一点?

【问题讨论】:

    标签: mysql sql many-to-many


    【解决方案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

    【讨论】:

    • 非常感谢您的快速回复。你能给我一个关于第一个案例的例子吗 - category IN (1,2) AND category IN (3)
    猜你喜欢
    • 2012-06-26
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    相关资源
    最近更新 更多