我有以下五个表:
- 互联网服务提供商
- 产品
- 联系
- 添加在
- AddOn/Product(多对多关系的数据透视表)。
每个产品都链接到一个 ISP,每个连接都列出一个产品。通过使用数据透视表(只有两个字段,一个用于产品 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
我正在使用 LEFT JOINS,因为产品可能根本没有插件。
我的问题是可以选择列出的连接必须具有的一些插件,以插件 ID 列表的形式呈现,例如 (1,14,237)。如果我将其作为附加条件放入 JOIN 语句(AND pa.addon_id IN (...))中,它将返回仅具有列出的插件之一的所有连接,但不一定是全部。
是否有某种方法可以通过 SQL 返回所有至少具有所有插件(它们也可以有附加)的连接?