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

MySQLの無効なクエリ:選択するにはネストのレベルが高すぎます

    MySQLバグ#41156に関連している可能性があります。派生テーブルのリストは相互のチェーンのように機能します-ネストされたサブクエリ

    バグログは、MySQL 5.0.72、5.1.30、および6.0.7に対して検証されたことを示しています。
    MySQL 5.1.37、MySQL 5.4.2(5.5.somethingになりました)、およびNDB7.1.0で修正されました。 。

    上記の質問で再設計されたクエリについて:

    ピボットクエリには注意が必要です。 Andrewが彼の答え で提案した方法を使用できます 。多くのUPC値を検索する場合は、SQLクエリを作成するためのアプリケーションコードを記述し、検索するUPC値の数と同じ数のJOIN句を追加する必要があります。

    MySQLには、1つのクエリで実行できる結合の数に制限がありますが、例では制限に達していません。つまり、表示するクエリは機能します。

    4つのUPCコードを検索するクエリの例を示していると仮定しますが、アプリはより多くのUPCコードに対して動的にクエリを作成する場合があり、61を超える場合もあります。

    クエリの目的は、リストされているUPCコードの少なくとも1つを含むストアを返すことであるようです。次のクエリでそれをより簡単に行うことができます:

    SELECT DISTINCT s.*
    FROM allStores AS s
    JOIN storeCheckRecords AS cr
      ON s.e_address = cr.e_address
         AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
    

    この方法を他の方法で使用することもできます。たとえば、4つすべてのUPCを備えた店舗を見つけることができます。

    SELECT s.*
    FROM allStores AS s
    JOIN storeCheckRecords AS cr
      ON s.e_address = cr.e_address
         AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
    GROUP BY s.e_address
    HAVING COUNT(DISTINCT upc) = 4;
    

    または、UPCの4つすべてではなく一部の店舗を見つけるには:

    SELECT s.*
    FROM allStores AS s
    JOIN storeCheckRecords AS cr
      ON s.e_address = cr.e_address
         AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
    GROUP BY s.e_address
    HAVING COUNT(DISTINCT upc) < 4;
    

    または、UPCの4つすべてが不足している店舗を見つけるには:

    SELECT s.*
    FROM allStores AS s
    JOIN storeCheckRecords AS cr
      ON s.e_address = cr.e_address
         AND cr.upc IN ('650637119004','650637119011','650637374007','650637374014');
    WHERE cr.e_address IS NULL;
    

    このクエリを作成するには、まだいくつかのコードを作成する必要がありますが、実行するのは少し簡単で、実行できる結合またはサブクエリの数の制限を超えることはありません。



    1. MySQLとPDO:PDO ::lastInsertIdは理論的に失敗する可能性がありますか?

    2. OracleのCOALESCE()関数

    3. 列で許可されている最大長を取得します、mysql

    4. MySQL:少なくとも1つがNULLにならないように列のセットを制約する