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

否定および/または複数の基準を持つmysqlの1対多クエリ

    サブクエリなしで除外結合を記述します:

    SELECT p.productid
    FROM   products p
    INNER JOIN producttags AS t ON p.productid = t.productid
    LEFT OUTER JOIN producttags AS x ON p.productid = x.productid 
           AND x.tag IN ('Motorcycle', 'Green')
    WHERE  p.active = 1
           AND t.tag IN ( 'Ford', 'Black', 'Skateboard' )
           AND x.productid IS NULL;
    

    2つの列(アクティブ、productid)の順に製品のインデックスがあることを確認してください。

    また、2つの列(productid、tag)の製品タグにこの順序でインデックスを付ける必要があります。

    もう1つのクエリは、すべて(車)、(スケートボード)、(緑とオートバイ)、(赤とオートバイ)のようなものです。

    これらの複雑な条件は、MySQLオプティマイザにとって難しい場合があります。一般的な回避策の1つは、UNIONを使用してより単純なクエリを組み合わせることです。

    SELECT p.productid
    FROM   products p
    INNER JOIN producttags AS t1 ON p.productid = t1.productid
    WHERE  p.active = 1
       AND t1.tag IN ('Car', 'Skateboard')
    
    UNION ALL
    
    SELECT p.productid
    FROM   products p
    INNER JOIN producttags AS t1 ON p.productid = t1.productid
    INNER JOIN producttags AS t2 ON p.productid = t2.productid 
    WHERE  p.active = 1
       AND t1.tag IN ('Motorcycle')
       AND t2.tag IN ('Green', 'Red');
    

    PS:タグ付けテーブルはEntity-Attribute-Valueテーブルではありません。



    1. 遅延初期化されたインスタンスを取得しようとしているLazyInitializationException

    2. sarの防衛(およびそれを構成する方法)

    3. MySQLの無効化および有効化キー

    4. 過去7日ごとに最大値を選択