У меня есть следующие пять таблиц:
- ISP
- Продукт
- Подключение
- аддон
- AddOn / Product (сводная таблица для отношения многие ко многим).
Каждый Продукт связан с Интернет-провайдером, каждое Соединение перечислено с Продуктом. Каждый продукт может иметь несколько надстроек, используя сводную таблицу (которая просто имеет 2 поля, одно для идентификатора продукта и одно для идентификатора AddOn).
Результат, который меня интересует, - это каждое соединение с перечисленными аддонами (для этого я использую GROUP_CONCAT MySQL, чтобы создать разделенный запятыми список поля name дополнения). Это работает отлично, как есть, запрос выглядит примерно так:
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
Я использую ЛЕВЫЕ СОЕДИНЕНИЯ, поскольку продукты могут вообще не иметь надстроек.
Моя проблема в том, что можно выбрать некоторые дополнения, которые ДОЛЖНЫ иметь перечисленные соединения, представленные в виде списка идентификаторов дополнений, например (1,14,237). Если я добавлю его в качестве дополнительного условия в операторах JOIN ( AND pa.addon_id IN (...) ), он вернет все соединения, которые имеют только один из перечисленных аддонов, но не обязательно все из них.
Есть ли какой-нибудь способ вернуть все соединения, которые как минимум имеют все дополнения (они могут иметь и дополнительные) через SQL?