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

Pi *_*rse 18 mysql sql database

我有一个表TEST与以下列:

code_ver (VARCHAR)
suite (VARCHAR)
date (DATE)
Run Code Online (Sandbox Code Playgroud)

现在我想选择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);
Run Code Online (Sandbox Code Playgroud)

理想情况下,此查询应该可以正常工作,但我的MySQL版本说:

此版本的MySQL尚不支持'LIMIT&IN/ALL/ANY/SOME子查询'

有人可以建议我替代这个查询吗?

小智 32

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;
Run Code Online (Sandbox Code Playgroud)

  • 为什么"(选择DISTINCT code_ver from test where code_ver NOT LIKE%DevBld%'ORDER by date DESC LIMIT 10)"不被视为子查询,LIMIT是允许的? (3认同)

yas*_*ash 15

您也可以使用相同的查询,只需在子查询之前添加一层额外的选择即可。就是这样。它会起作用。

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);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这个解决方案有效并且值得接受 (2认同)

pil*_*row 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;
Run Code Online (Sandbox Code Playgroud)

(当然,您也可以右键加入,然后删除外部WHERE条件.)


Sar*_*ara -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;
Run Code Online (Sandbox Code Playgroud)

更新:尝试下面的方法,这样订单就可以工作:

 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;
Run Code Online (Sandbox Code Playgroud)

  • 如果有多行与 name 关联,它就不起作用,它只会显示“test”表的 10 行。我认为这不是问题的正确解决方案。 (11认同)