【问题标题】:mysql: select all items from table A if not exist in table Bmysql:如果表B中不存在,则从表A中选择所有项目
【发布时间】:2011-06-07 08:20:50
【问题描述】:

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

我的查询如下所示

从房间中选择 id、房间名称 不存在的地方 (从房间事件中选择 * WHERE room_start BETWEEN '1294727400' 和 '1294729200' 要么 room_finish 在“1294727400”和“1294729200”之间)

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

【问题讨论】:

    标签: mysql select not-exists


    【解决方案1】:

    这是你想要做的原型:

    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'
    

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

    【讨论】:

    • 谢谢,它成功了,我想我在尝试的时候忘记加括号了。
    【解决方案2】:

    您无法仅使用该房间中的事件。这是通过匹配 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')
    

    【讨论】:

    • 我仍然没有得到任何结果 :-(
    • 我错过了识别必须从中获取字段的表的部分。
    猜你喜欢
    • 2013-03-31
    • 2019-05-16
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多