替代在MYSQL中的SubQuery中使用LIMIT关键字

时间:2012-10-10 00:34:52

标签: mysql sql database

我有一个包含以下列的表TEST:

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

现在我想选择10行,其中包含不同的c 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 个答案:

答案 0 :(得分:29)

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;

答案 1 :(得分: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;

(当然,您也可以直接加入,并删除外部WHERE条件。)

答案 2 :(得分:2)

您还可以使用相同的查询,只需在子查询之前增加一层select即可。就是这样。它将起作用。

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

答案 3 :(得分:-6)

您获得的错误并不完全是因为MySQL的版本。我认为所有版本都支持这一点。您必须更改LIMIT 10位置并将其放在“)”之后。请让我知道这对你有没有用。我跑了一个轰鸣声,它起作用了。

E.g。

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;