2013-10-03 5 views
0

У меня есть база данных SQLite с 3 таблицами, interests, events, categories. Вы можете добавить категорию в свои интересы, и мне нужно написать запрос, который вытягивает все события, прикрепленные к этой категории.SQLite LEFT JOIN игнорируется предложением WHERE

Вы также можете добавить мероприятие в свои интересы или отключить мероприятие, чтобы оно не отображалось под категорией.

например. заинтересованы во всех эпизодах «Теории большого взрыва», но отключите один эпизод, который вы уже видели.

Этот запрос выбирает все события для категории в таблице интересов, в том числе события инвалидов:

SELECT events.id AS event_id, events.title, event_interests.disabled 
FROM interests 
    JOIN events ON events.category_id = interests.id 
     AND interests.type LIKE "category" 
    LEFT JOIN interests AS event_interests ON event_interests.id = events.id 
     AND event_interests.type LIKE "event" 

Что дает следующие результаты:

Event_ID Title   Disabled 
122749 Bad Education  
122815 Bad Education 1 
122852 Bad Education 

Этот запрос делает то же самое, но пределы to инвалидов

SELECT events.id AS event_id, events.title, event_interests.disabled 
FROM interests 
    JOIN events ON events.category_id = interests.id 
     AND interests.type LIKE "category" 
    LEFT JOIN interests AS event_interests ON event_interests.id = events.id 
     AND event_interests.type LIKE "event" 
WHERE event_interests.disabled = 1 

Только возвращенный номер возвращается

Event_ID Title   Disabled  
122815 Bad Education 1 

Но я хочу, чтобы все события , которые не отключены. Но перевернув WHERE event_interests.disabled не дает мне, что:

SELECT events.id AS event_id, events.title, event_interests.disabled 
FROM interests 
    JOIN events ON events.category_id = interests.id 
     AND interests.type LIKE "category" 
    LEFT JOIN interests AS event_interests ON event_interests.id = events.id 
     AND event_interests.type LIKE "event" 
WHERE event_interests.disabled != 1 

Это дает пустой набор результатов, вместо возвращения событий 122749, 122852

Я сделал что-то глупое с моим JOIN и?

ответ

1

Я полагаю, что disabled столбец может быть NULL. Для тестирования с NULL, вы всегда должны быть конкретными: WHERE disabled IS NULL.

В принципе, почти любое сравнение с NULL всегда приводит к NULL. Итак, если вы спросите «Дайте мне все строки, где отключено не 1», база данных не сможет дать вам строки с NULL, потому что для всего, что она знает, NULL может означать «Нет данных, но может быть 1».

Более удивительная информация in the documentation.

+0

Это может быть NULL, 1 или 0. Я хочу получить 0 или NULL –

+0

Тогда вы должны сказать, что явно: 'disabled = 0 ИЛИ disabled IS NULL'. – Denis

+0

Да, я могу! 'WHERE event_interests.disabled IS NULL ИЛИ event_interests.disabled = 0' отлично работает. Спасибо, Денис. Почему это, хотя, видя, что '1! = NULL' –

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