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

从表中排除某些值的SQL查询,sql,Sql,大家好,我正在建立一个房间分配系统,检查房间是否在给定日期可用。这里有大约20个独特的房间ID,我只是将其作为上面几个房间ID的一部分 因此,例如,如果用户输入的日期为2012-01-01,我希望将房间id1从结果中排除,因为如上所示,该日期已预订 从某种意义上说,用户的入住日期之间的任何匹配都会导致相应房间id的整个列表从列表中排除 我使用了以下SQL查询: SELECT DISTINCT room_id FROM room_booking WHERE date_booked<>'

大家好,我正在建立一个房间分配系统,检查房间是否在给定日期可用。这里有大约20个独特的房间ID,我只是将其作为上面几个房间ID的一部分

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

从某种意义上说,用户的入住日期之间的任何匹配都会导致相应房间id的整个列表从列表中排除

我使用了以下SQL查询:

SELECT DISTINCT room_id
FROM room_booking
WHERE date_booked<>'$date'
选择不同的房间\u id
从客房预订
您预订的日期为“$date”

不幸的是,它不起作用,因为尽管它排除了单行的结果,但它包含了给定房间id的其余结果

您可以使用一个
不存在的

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 )

我没试过这个,但我来了

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的房间表-这可能是查找所有房间的更好地方,因为您不能保证每个房间都有预订,因此不能单靠预订表

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

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

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

下面的内容应该更有效,并且应该在很多数据库平台上都有效。当然,这取决于如果有任何与字符串相关的项目要考虑的话,值的数量会发生变化……/P>
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

使用您正在使用的特定数据库发表文章通常是有帮助的,因为每个数据库都支持稍微不同的SQL方言。
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