2012-06-18 2 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 

И то, что я действительно не понимаю: почему Query 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' AND '1991-08-04' AND ui.id = uo.id) ORDER BY uo.timestamp_lastonline DESC LIMIT 20' – Chris

ответ

9

Query 1: Если хотя бы одна запись между датами существует то вся talbe извлекается.

Запрос 2: Получены только записи между датами.

Прочитано here за то, как EXISTS работает.

1

Ваш второй запрос использует BETWEEN для возврата каждой записи МЕЖДУ первой записью с '1989-08-04' и следующей записью с '1991-08-04', а затем заказывает их timestamp_lastonline DESC. Обратите внимание, что это буквально возвращает записи между двумя записями с этими двумя значениями, а не с каждой записью, которая имеет год между 1989 и 1991 годами (если вы не указали вручную, чтобы они были хронологически проиндексированы!). Мне интересно, как вы думаете, что ваш первый запрос возвращает, так как он получит каждую запись в таблице, упорядоченную по timestamp_lastonline, если есть строка, возвращаемая предложением BETWEEN.

Смежные вопросы