我有以下五个表:
每个产品都链接到一个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返回 至少 具有所有附加组件(也可以具有附加组件)的所有连接?
GROUP BY set-of-column HAVING SUM(CASE WHEN ISNULL(pa.addon_id, 0) IN (1,14,237) THEN 1 ELSE 0 END) = 3