我有以下五个表:
每个产品都链接到ISP,每个连接都列在产品中。通过使用数据透视表(只有2个字段,一个用于产品ID,一个用于AddOn 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
我正在使用LEFT JOINS,因为产品可能根本没有插件。
我的问题是可以选择列出连接必须具有的一些插件,作为插件ID列表显示,如(1,14,237)。如果我把它作为JOIN语句中的附加条件( AND pa.addon_id IN(...)),它将返回只有一个列出的插件的所有连接,但不一定所有这些。
有没有办法通过SQL返回所有连接,因为最小包含所有插件(它们还可以有其他插件)?
答案 0 :(得分:2)
GROUP BY set-of-column
HAVING SUM(CASE WHEN ISNULL(pa.addon_id, 0) IN (1,14,237) THEN 1 ELSE 0 END) = 3
答案 1 :(得分:0)
您可以添加到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
)
)