仅获取与联接表(SQL)中的所有条目匹配的行

仅获取与联接表(SQL)中的所有条目匹配的行,sql,join,Sql,Join,我有以下五个表格: ISP 产品 联系 插件 插件/产品(多对多关系的透视表) 每个产品都链接到一个ISP,每个连接都列出到一个产品。通过使用pivot表(pivot表只有两个字段,一个用于产品ID,一个用于加载项ID),每个产品都可以有多个加载项 我感兴趣的结果是与列出的插件的每个连接(为此,我使用MySQL的GROUP_CONCAT,来创建一个以逗号分隔的插件名称字段列表)。这可以正常工作,查询如下所示: SELECT i.name AS ispname, i.img_link, c.d

我有以下五个表格:

  • ISP
  • 产品
  • 联系
  • 插件
  • 插件/产品(多对多关系的透视表)
每个产品都链接到一个ISP,每个连接都列出到一个产品。通过使用pivot表(pivot表只有两个字段,一个用于产品ID,一个用于加载项ID),每个产品都可以有多个加载项

我感兴趣的结果是与列出的插件的每个连接(为此,我使用MySQL的GROUP_CONCAT,来创建一个以逗号分隔的插件名称字段列表)。这可以正常工作,查询如下所示:

SELECT i.name AS ispname, i.img_link, c.download, c.upload, c.monthly_price, c.link, 
GROUP_CONCAT(a.name) AS addons, SUM(pa.monthly_fee) AS addon_price
FROM isp i JOIN product p ON i.id = p.isp_id
JOIN `connection` c ON p.id = c.product_id LEFT JOIN product_addon pa ON pa.product_id = p.id AND pa.forced = 0
LEFT JOIN addon a ON pa.addon_id = a.id GROUP BY c.id
我使用左连接,因为产品可能根本没有插件

我的问题是,可以选择列出的连接必须具有的一些插件,以插件ID列表的形式显示,如(1,14237)。如果我把它作为附加条件放在JOIN语句中(以及(…)中的pa.addon_id),它将返回仅包含一个列出的加载项的所有连接,但不一定全部返回


是否有某种方法可以通过SQL返回所有连接,这些连接至少包含所有插件(它们也可以包含其他插件)?

您可以添加到WHERE子句:

AND NOT EXISTS (SELECT NULL FROM addon a2
                WHERE  a2.addon_id IN (1,14,237)
                AND NOT EXISTS
                ( SELECT NULL
                  FROM   product_addon pa2
                  WHERE  pa2.addon_id = a2.addon_id
                  AND    pa2.product_id = p.product_id
                )
               )
或相当于:

AND NOT EXISTS (SELECT NULL FROM addon a2
                LEFT JOIN product_addon pa2
                  ON pa2.addon_id = a2.addon_id
                 AND pa2.product_id = p.product_id
                WHERE a2.addon_id IN (1,14,237)
                AND   pa2.product_id IS NULL
                )
               )
GROUP BY set-of-column
HAVING SUM(CASE WHEN ISNULL(pa.addon_id, 0) IN (1,14,237) THEN 1 ELSE 0 END) = 3