繁体   English   中英

从表中排除某些值的 SQL 查询

[英]SQL query to exclude certain values from table

在此处输入图片说明

大家好,我正在构建一个房间分配系统,用于检查在给定日期是否有房间可用。 大约有 20 个独特的房间 ID,我只是作为上面几个的片段包括在内。

因此,例如,如果用户输入 2012-01-01 的日期,我希望从结果中排除 1 的room_id ,因为如上所示,该日期已被预订。

从某种意义上说,在用户输入的日期之间找到的任何匹配都会导致相应的 room_id 的整个列表从列表中排除。

我使用了以下 SQL 查询:

SELECT DISTINCT room_id
FROM room_booking
WHERE date_booked<>'$date'

不幸的是它不起作用,因为虽然它排除了单行的结果,但它包括给定room_id的其余结果?

您可以使用NOT EXISTS

SELECT DISTINCT room_id
  FROM room_booking rb1
 WHERE NOT EXISTS( SELECT 1
                     FROM room_booking rb2
                    WHERE rb2.date_booked = <<date>>
                      AND rb2.room_id     = rb1.room_id )

NOT IN

SELECT DISTINCT room_id
  FROM room_booking
 WHERE room_id NOT IN (SELECT room_id
                         FROM room_booking rb2
                        WHERE rb2.date_booked = <<date>>)

没有试过这个,但这里是

SELECT DISTINCT room_id
FROM room_booking
WHERE room_id NOT IN 
    (SELECT DISTINCT room_id
     FROM room_booking
     WHERE date_booked = '$date'
    )

考虑到您有一个名为RoomID的列,我将假设有一个带有相应列 RoomID 的 Room 表 - 这可能是查找所有房间的更好的地方,因为您不能保证每个房间都有预订,并且所以不能仅仅依靠预订表。

然后,您可以使用子查询查找某个日期预订了哪些房间,然后返回所有不在该列表中的 RoomId。

select RoomID from Room
where RoomID not in
(select RoomID from room_booking
where date = @date)

以上应该可以工作,但是如果添加了很多房间,可能会变慢。 您可能需要考虑左外连接。 它通常会更快,因为上面将执行子查询,即对于每个房间,重新查询数据库以检查它是否具有此日期的值,每次执行此查询时都会导致 40 * 40 检查,并且会随着数量增加当前预订。

以下应该更有效,并且应该在相当多的数据库平台上有效。 当然,这取决于如果有任何与字符串性能相关的项目需要考虑,值的计数可能会改变多少......

SELECT DISTINCT room_id
           FROM room_booking rb1
LEFT OUTER JOIN room_booking datecheck
             ON rb1.room_id = datecheck.room_id
            AND datecheck.date_booked  =  @date
          WHERE datecheck.room_id is null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM