sql >> データベース >  >> RDS >> Mysql

SQL:カテゴリから製品を取得しますが、別のカテゴリのセットにも含まれている必要があります

    このタイプの問題は、関係分割と呼ばれます。 。

    2つの一般的な解決策があります:

    1. 最初のソリューションは、一致するカテゴリをまとめて、固定文字列と比較します:

      SELECT p2c.product_id
      FROM oc_product_to_category p2c
      GROUP BY p2c.product_id
      HAVING GROUP_CONCAT(p2c.category_id SEPARATOR ',' ORDER BY p2c.category_id) = '1,2'
      
    2. 2番目のソリューションはJOINを実行します 必要な値ごとに:

      SELECT p.product_id 
      FROM oc_product p 
      INNER JOIN oc_product_to_category p2c1 
        ON (p.product_id = p2c1.product_id AND p2c1.category_id = 1) 
      INNER JOIN oc_product_to_category p2c2 
        ON (p.product_id = p2c2.product_id AND p2c2.category_id = 2) 
      

    これらのソリューションについては、プレゼンテーション SQLクエリパターン、最適化 で説明しています。 。テストの結果、結合ソリューションの方がパフォーマンスがはるかに優れていることがわかりました。

    @Tomの提案は正しいです。完全なクエリでは、次のようになります。

        SELECT p.product_id, GROUP_CONCAT(p2c3.category_id SEPARATOR ',') AS categories
        FROM oc_product p 
        INNER JOIN oc_product_to_category p2c1 
          ON (p.product_id = p2c1.product_id AND p2c1.category_id = 1) 
        INNER JOIN oc_product_to_category p2c2 
          ON (p.product_id = p2c2.product_id AND p2c2.category_id = 2) 
        INNER JOIN oc_product_to_category p2c3
          ON (p.product_id = p2c3.product_id)
        GROUP BY p.product_id;
    

    DISTINCT @Tomが提案するのは、p2cテーブルに(product_id、category_id)に対するUNIQUE制約があるため、必要ないはずです。




    1. 一般的なエラーを解決する方法:2006MySQLサーバーがなくなりました

    2. PostgreSQL DESCRIBE TABLE

    3. MySQLWorkbenchの代替-ClusterControl構成管理

    4. 致命的なエラー:未定義の関数mysqli_result()の呼び出し