仅获取与联接表(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
- 产品
- 联系
- 插件
- 插件/产品(多对多关系的透视表)
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