14

我在从表 a (id, room_name) 中选择值时遇到问题,其中表 b (room_id, room_start, room_finish) 中没有相应的事件

我的查询如下

从房间中选择 id、房间名称
不存在的地方
(选择 * 从 room_events
    WHERE room_start BETWEEN '1294727400' AND '1294729200'
          或者
          room_finish 在“1294727400”和“1294729200”之间)

表 a 包含多个房间,表 b 包含房间事件 如果时间戳内的任何房间有任何事件,我没有得到任何结果。我希望所有房间都没有活动。

4

2 回答 2

29

这是您想要做的原型:

SELECT * FROM table1 t1
  WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t1.id = t2.id)

在这里,id假设是两个表中的 PK 和 FK。你应该做相应的调整。另请注意,在这种情况下比较 PK 和 FK 很重要。

因此,您的查询应如下所示:

SELECT id, room_name FROM rooms r
WHERE NOT EXISTS 
(SELECT * FROM room_events re
    WHERE
          r.room_id = re.room_id
          AND
          (
          room_start BETWEEN '1294727400' AND '1294729200' 
          OR 
          room_finish BETWEEN '1294727400' AND '1294729200')
          )

如果需要,您可以通过在 mysql 客户端中执行查询来检查查询的各个部分。例如,您可以确定以下是否返回任何记录:

SELECT * FROM room_events 
    WHERE room_start BETWEEN '1294727400' AND '1294729200' 
          OR 
          room_finish BETWEEN '1294727400' AND '1294729200'

如果没有,你已经找到了罪魁祸首,并采取了相应的其他部分:)

于 2011-01-11T18:00:08.417 回答
0

您错过了仅使用该房间中的事件。这是通过匹配 id 来完成的。

SELECT id, room_name FROM rooms r
WHERE NOT EXISTS 
(SELECT * FROM room_events re
      WHERE r.id = re.room_id AND
      room_start BETWEEN '1294727400' AND '1294729200' 
      OR 
      room_finish BETWEEN '1294727400' AND '1294729200')
于 2011-01-11T18:01:49.297 回答