32

次の列を持つテーブル TEST があります。

code_ver (VARCHAR)
suite (VARCHAR)
date (DATE)

ここで、c の個別の値を持つ 10 行を選択したいode_ver & code_ver NOT LIKE '%DevBld%' sorted by date desc.

そこで、次のクエリを書きました。

select * 
  from test 
 where code_ver IN (select DISTINCT code_ver 
                      from test 
                     where code_ver NOT LIKE '%DevBld%' 
                     ORDER by date DESC LIMIT 10);

このクエリは理想的には機能するはずですが、私のバージョンの MySQL は次のように言っています。

このバージョンの MySQL はまだ「LIMIT & IN/ALL/ANY/SOME サブクエリ」をサポートしていません

誰かがこのクエリの代替案を提案できますか?

4

4 に答える 4

63

私の範囲では、Laykeが提案した回答は間違っています。サブクエリで制限を使用する意図は、サブクエリからフェッチされた制限されたレコードに対してメインクエリが実行されるためです。また、制限を外部に保持すると、サブクエリで制限が役に立たなくなります。

mysql はサブクエリでまだ制限をサポートしていないため、代わりに次のように JOIN を使用できます。

       
    SELECT * FROM test
    JOIN 
    (
        SELECT DISTINCT code_ver 
        FROM test 
        WHERE code_ver NOT LIKE '%DevBld%' 
        ORDER BY date DESC LIMIT 10
    ) d
    ON test.code_ver
    IN (d.code_ver)
    ORDER BY xyz;
于 2016-04-20T11:28:39.987 に答える
8

サブクエリを派生テーブルに入れます。

   SELECT test.*
     FROM test
LEFT JOIN (SELECT DISTINCT code_ver
             FROM mastertest
            WHERE code_ver NOT LIKE '%DevBld%'
            ORDER BY `date` DESC
            LIMIT 10) d
    USING (code_ver)
    WHERE d.code_ver IS NOT NULL;

(もちろん、それを RIGHT JOIN して、外側の WHERE 条件を削除することもできます。)

于 2012-10-10T00:38:56.113 に答える
-14

発生しているエラーは、正確には MySQL のバージョンが原因ではありません。すべてのバージョンがそれをサポートしていると思います。LIMIT 10 の場所を変更して、")" の後に配置する必要があります。それがあなたのために働くかどうか私に知らせてください。私は自分で以下のものを実行しましたが、動作します。

例えば

SELECT * FROM test where name IN (
           SELECT DISTINCT name 
           FROM projects 
           WHERE name NOT LIKE "%DevBld%"  
           ORDER by date_created DESC
 ) LIMIT 10;

更新:以下のものを試してください。この方法で順序が機能します:

 SELECT * FROM  automation.e2e_projects WHERE name IN (
       SELECT DISTINCT name 
       FROM automation.e2e_projects
       WHERE name NOT LIKE "%DevBld%"
 ) ORDER by date_created DESC LIMIT 10;
于 2012-10-10T04:14:25.560 に答える