>我有一个表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 子查询'
有人可以建议我此查询的替代方案吗?
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;
您也可以使用相同的查询,只需在子查询之前添加一层额外的选择即可。 仅此而已。它会起作用。
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);
将子查询放在派生表中:
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 条件。
也许有点晚了,但是您可以将子查询包装到另一个查询中,然后从子查询中获取所有内容
SELECT * FROM tableWHERE id NOT IN
(SELECT * FROM
( SELECT id FROM table LIMIT 0, 2) as SUBQUERY
)
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
您收到的错误并不完全是因为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;