MySQL Intersect Query на одной таблице

У меня есть таблица, содержащая информацию о событиях для пользователей, т. е. каждая строка содержит идентификатор, дату начала пользователя, дату завершения и номер события. Пример:

Ряд 1: ID 256 | Дата начала 13360500 | Дата окончания 13390500 | EventNum 3

Я пытаюсь пересечь все строки для пользователей, которые завершили события 3 и 2, но я не могу понять, почему мой запрос не возвращает результатов:

SELECT table_id FROM table
    WHERE table_EventNum = 3 
    AND table_FinishDate > 0

    AND table_id IN (SELECT table_id FROM table WHERE table_EventNum = 2);

Этот запрос без подзапроса (строка, отделенная от остальных внизу) возвращает кучу ненулевых результатов, как и должно быть, и подзапрос также возвращает кучу ненулевых результатов (опять же, как и должно). Но по какой-то причине составной запрос вообще не возвращает никаких строк. Я знаю, что команда IN возвращает NULL, если выражение с любой стороны равно NULL, но поскольку оба запроса возвращают результаты, я не уверен, что еще может вызвать это.

Любые идеи? Спасибо!


person mgh14    schedule 09.07.2013    source источник


Ответы (1)


Предполагая, что FinishDate имеет значение NULL, когда событие не завершено. Также предполагается, что должна быть строка с совпадающим идентификатором и номером события 2, и что событие 3 не может произойти до события 2:

SELECT t1.table_id FROM table t1 INNER JOIN table t2 ON t1.table_id = t2.table_id
    WHERE t1.table_EventNum = 3 AND t2.table_EventNum = 2
    AND NOT t1.table_FinishDate IS NULL

Обратите внимание, что я не смог найти ничего плохого в вашем запросе, кроме того факта, что вам не нужен подзапрос.

person Tarik    schedule 09.07.2013
comment
Имеет ли значение, что я выбираю только table_id вместо FinishDate и table_id? Я думал, что MySQL сначала выполнит действие SELECT, а затем выполнит команду IN (ID)? - person mgh14; 09.07.2013
comment
ВЫБЕРИТЕ table_id, FinishDate ИЗ таблицы, ГДЕ table_EventNum = 3 И table_FinishDate › 0 И table_id В (ВЫБЕРИТЕ table_id ИЗ таблицы, ГДЕ table_EventNum = 2); -- должно быть в порядке, без разницы - person Tarik; 09.07.2013