次の5つのテーブルがあります。
- ISP
- 製品
- 繋がり
- アドオン
- AddOn/Product (多対多関係のピボット テーブル)。
各製品は ISP にリンクされ、各接続は製品にリストされます。各製品は、ピボット テーブル (製品 ID 用とアドオン ID 用の 2 つのフィールドのみ) を使用して、多数のアドオンを持つことができます。
私が興味を持っている結果は、リストされているアドオンとの各接続です (これには 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 を使用しています。
私の問題は、(1,14,237) のようなアドオン ID のリストとして提示された、リストされた接続が持つ必要があるいくつかのアドオンを選択できることです。JOIN ステートメント ( AND pa.addon_id IN (...) ) の追加条件としてそれを入れると、リストされたアドオンの 1 つだけを持つすべての接続が返されますが、必ずしもすべてではありません。
少なくともすべてのアドオンを持つすべての接続を SQL 経由で返す方法はありますか?