mysql left join - 使用NULL和条件返回行

时间:2014-05-27 15:56:36

标签: mysql sql join null

我有两张桌子:'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的行?

...谢谢!

2 个答案:

答案 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;

SQL Fiddle demo