我有一个包含3个表的SQLite数据库,interests
,events
,categories
。您可以根据自己的兴趣添加类别,我需要编写一个查询来提取附加到该类别的所有事件。
您还可以根据自己的兴趣添加活动,或者停用某个活动,以便它不会显示在某个类别下方。
e.g。对所有“大爆炸理论”剧集感兴趣,但禁用你已经看过的一集。
此查询选择兴趣表中某个类别的所有事件,包括已禁用的事件:
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
此查询完全相同,但限制为禁用兴趣
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
我的JOINs做过蠢事吗?
答案 0 :(得分:1)
我认为disabled
列可以是NULL
。
要对NULL
进行测试,您必须具体:WHERE disabled IS NULL
。
基本上,几乎所有与NULL
的比较都会产生NULL
。
因此,如果你问“给我所有行禁用不是1”,数据库就无法为你提供NULL
行,因为据他所知,NULL
可能意味着“没有数据,但是可能是1“。
更令人惊讶的信息in the documentation。