在MYSQL的子查询中使用LIMIT关键字的替代方法

bbmckpt7  于 2023-11-16  发布在  Mysql
关注(0)|答案(7)|浏览(154)

我有一个表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 subquery”
有人能给我一个替代这个问题的建议吗?

jljoyd4f

jljoyd4f1#

Layke建议的答案在我的权限范围内是错误的。在子查询中使用limit的意图是使主查询在从子查询获取的有限记录上运行。如果我们将limit保持在外部,那么它使limit对子查询无用。
由于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;

字符串

2admgd59

2admgd592#

你也可以使用同样的查询,只需要在子查询前多加一层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);

字符串

gpnt7bae

gpnt7bae3#

将子查询放入派生表中:

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;

字符串
(You当然,也可以RIGHT JOIN,并删除外部WHERE条件。)

gupuwyp2

gupuwyp24#

也许有点晚,但您可以将子查询 Package 到另一个查询中,然后从子查询中获取所有内容

SELECT * FROM tableWHERE id NOT IN 
    (SELECT * FROM 
        ( SELECT id FROM table LIMIT 0, 2) as SUBQUERY
    )

字符串

hfyxw5xn

hfyxw5xn5#

SELECT * FROM test WHERE code_ver IN(SELECT code_ver,RANK()OVER(ORDER BY date DESC)AS rank_of_date FROM test WHERE code_ver NOT LIKE '%DevBld%')WHERE rank_of_date <= 10);

gdx19jrr

gdx19jrr6#

select * from test t1, (select DISTINCT code_ver 
                      from test 
                     where code_ver NOT LIKE '%DevBld%' 
                     ORDER by date DESC LIMIT 10 ) as t2
where t1.code_ver=t2.code_ver

字符串

oxf4rvwz

oxf4rvwz7#

你得到的错误并不完全是因为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;

相关问题