【问题标题】:MySQL: Why do these queries return different results?MySQL:为什么这些查询返回不同的结果?
【发布时间】:2012-06-18 08:15:07
【问题描述】:

查询 1:

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

而我真正不明白的是:为什么 Query 2 返回错误的结果?它返回一个列表,首先按birthdate 排序,然后按timestamp_lastonline...

【问题讨论】:

  • 哦,可惜Tim删了他的答案,很有帮助(从内部和外部查询连接PK):SELECT * FROM user_d1 uo WHERE EXISTS (SELECT 1 FROM user_d1 ui WHERE ui.birthdate BETWEEN '1989-08-04' AND '1991-08-04' AND ui.id=uo.id) ORDER BY uo.timestamp_lastonline DESC LIMIT 20

标签: mysql sql database select


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您的第二个查询使用 BETWEEN 返回第一个带有 '1989-08-04' 的条目和下一个带有 '1991-08-04' 的条目之间的每个条目,然后按 timestamp_lastonline DESC 排序。请注意,这实际上是返回具有这两个值的两个条目之间的条目,而不是在 1989 年到 1991 年之间的每个条目(除非您手动订购这些条目以按时间顺序编制索引!)。我很想知道您认为您的第一个查询返回什么,因为如果 BETWEEN 子句返回一行,它将获取按timestamp_lastonline 排序的表中的每个条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多