获取有限选择中不存在的行

时间:2014-01-09 01:59:31

标签: mysql sql

我正在尝试获取行项目,其中该项目不应存在于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分。我想这很简单。 :)

1 个答案:

答案 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