我正在尝试获取行项目,其中该项目不应存在于select语句中,且返回的行数有限。顺便说一句,请不要IN语句,因为mysql版本不支持IN。
那么我究竟需要的是获得前20行用户然后如果用户存在于应该是最终列表的前20位,否则我需要显示该用户。为了实现这一点,我计划进行两个查询,然后使用union但不知道为什么我的查询总是返回零结果,它应返回1条记录。这是我获取前20名不存在的记录的查询:
select t.*
from
user t
where t.iduser=39
and not exists (select u.* from user u order by points desc limit 20)
我希望获得id 39的整行,但返回零结果。
我也试过这个问题:
select t.*
from
(select u.* from user u order by points desc limit 20) u,
user t
where t.iduser <> u.iduser
and t.iduser = 39
但仍然没有为我工作。其中,如果我将id改为11,其中iduser 11存在于顶部20并且改变了&lt;&gt; into =它返回11行而不是39按预期返回。我迷失了。
根据要求,好的只是为了更多的想法select u.* from user u order by points desc limit 20
返回:
iduser 1-20,分别为0-19 desc。我有40行,其中21-40有0分。我想这很简单。 :)
答案 0 :(得分:0)
它不起作用,因为您的not exists
子句等同于true
。子查询始终返回非空结果(前20个用户)。
如果您更喜欢not exists
,请尝试以下操作:
select t.*
from
user t
where t.iduser=39
and not exists (
select * from (select u.* from user u order by points desc limit 20) x
where t.iduser=x.iduser
)
可能更快的解决方案是:
select t.*
from
user t
LEFT OUTER JOIN
(select u.* from user u order by points desc limit 20) u
ON t.iduser = u.iduser
where u.iduser IS NULL
and t.iduser = 39