2

次の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 経由で返す方法はありますか?

4

2 に答える 2

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
于 2008-12-02T13:11:06.977 に答える
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
                )
               )
于 2008-12-02T12:30:30.303 に答える