2012-06-18 274 views
0

查询1:MySQL:为什么这些查询返回不同的结果?

SELECT * 
FROM user_d1 
WHERE EXISTS (SELECT 1 
       FROM `user_d1` 
       WHERE birthdate BETWEEN '1989-08-04' AND '1991-08-04') 
ORDER BY timestamp_lastonline DESC 
LIMIT 20 

查询2:

SELECT * 
FROM user_d1 
WHERE birthdate BETWEEN '1989-08-04' AND '1991-08-04' 
ORDER BY timestamp_lastonline DESC 
LIMIT 20 

什么我真的不明白:为什么查询2返回错误的结果?它返回最初由birthdate,然后下令timestamp_lastonline列表...

+0

哦,这是一个遗憾,蒂姆删除了他的答案,这是非常有益的(从内部和外部查询连接PK):'SELECT * FROM user_d1 uo WHERE EXISTS(SELECT 1 FROM user_d1 ui WHERE ui.birthdate BETWEEN'1989-08-04'和'1991-08-04'和ui.id = uo.id)ORDER BY uo.timestamp_lastonline DESC LIMIT 20' – Chris

回答

9

查询1:如果日期之间至少有一个记录存在那么整个talbe检索。

查询2:只检索日期之间的记录。

阅读here了解EXISTS的工作原理。

1

您的第二个查询使用BETWEEN返回第一个条目与'1989-08-04'和下一个条目'1991-08-04'之间的每个条目,然后通过timestamp_lastonline DESC命令这些条目。请注意,这实际上是在两个条目之间使用这两个值返回条目,而不是每个条目都具有1989年到1991年之间的一年(除非您手动将这些条目按顺序索引!)。我很希望看到您的第一个查询返回的内容,因为如果有BETWEEN子句返回的行,它将按照timestamp_lastonline的顺序获取表中的每个条目。

相关问题