簡體   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