2012-06-18 178 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的順序獲取表中的每個條目。

相關問題