我有两张桌子:'shift'和'event'。一个班次有很多事件。
一些示例数据:
---- shift ----
id - location
1 - mcdonalds
2 - burger king
3 - subway
--- event ---
id - shift_id - type - note
1 - 1 - 2 - bingo
2 - 1 - 3 - bingo
3 - 2 - 4 - ignore
4 - 2 - 2 - ignore
事件具有类型,例如:type'4'表示开始转换的事件。
我想构建一个查询,返回所有没有事件记录的班次,其中type = 4.所以在上面的例子中,我会带回麦当劳。
我到目前为止:
SELECT
shift.location AS location,
FROM shift
LEFT JOIN event ON event.shift_id=shift.id
这就是我被卡住的地方。显然可以添加
WHERE event.type IS NULL
..但是如何只返回null为type = 4的行?
...谢谢!
答案 0 :(得分:1)
如果您使用LEFT JOIN
,您可以丢弃类型为4的行,但如果您有两个事件的班次,一个等于4而另一个不等于......您将获得该班次因为存在行数不同4.当您使用NOT EXISTS
时,您会对子查询的所有行进行分析。
试试这个:
SELECT *
FROM shift s
WHERE NOT EXISTS(
SELECT 'EVENT'
FROM event e
WHERE e.shift_id = s.id
AND e.type = '4'
)
答案 1 :(得分:1)
以下查询选择事件表中type = 4的所有班次。然后在该数据和移位表之间进行LEFT JOIN。选择了具有event.shift_id的行(意味着没有type = 4的shift_id)。
SELECT
shift.*
FROM shift
LEFT JOIN (SELECT DISTINCT shift_id FROM event WHERE type = 4) event ON event.shift_id=shift.id
WHERE event.shift_id IS NULL;