簡體   English   中英

MySQL:僅在滿足某些條件時更新項目

[英]MySQL: Updating an item only if certain conditions are met

有誰知道如何僅在其中一行的列不等於表中另一行的同一個列的情況下更新行?

讓我解釋。 考慮這張桌子。 它存儲一些預訂,管理員可以決定批准​​哪個預訂。

Booking |  Time | Approved
   0    |  5:00 |   NO
   1    |  5:00 |   NO
   2    |  6:00 |   YES
   3    |  6:00 |   NO

預訂請求可能會重疊,例如,預訂0和1。管理員可以決定批准​​0還是1。

但是批准的預訂不能重疊。 例如,由於預訂2已在6:00批准,因此預訂3無法被批准。 除非管理員決定先拒絕預訂2。

我將如何為此編寫查詢以確保不會發生沖突? 我在考慮以下方面:

 UPDATE requests
 SET Approved = 'YES'
 WHERE Booking = 3
 AND NOT EXISTS (
    (SELECT Time 
    FROM requests
    WHERE Booking = 3)
    = 
    (SELECT Time
    From requests
    WHERE Booking != 3)
 );

但這是行不通的。

任何幫助將非常感激。

作為旁注。 我的實際問題有點復雜。 桌子看起來更像

Booking |  Start Time | End Time |Approved
   0    |  5:00       |   6:00   | NO
   1    |  5:00       |   7:00   | NO
   2    |  6:00       |   8:00   | YES
   3    |  6:00       |   9:00   | NO

而且我正努力防止預訂重疊。 但是我敢肯定,如果我對問題的簡單版本使用正確的語法,那么我也將能夠找出復雜的版本。

您沒有正確使用NOT EXISTS 它的參數應該是單個子查詢,而不是比較兩個子查詢的表達式。 在您的情況下,子查詢中的條件是時間相同,但ID與您要更新的ID不同,並且另一個ID已被批准。

UPDATE request AS r1
SET approved = 'YES'
WHERE r1.id = 3
AND NOT EXISTS (
    SELECT *
    FROM request AS r2
    WHERE r2.time = r1.time AND r2.id != r1.id AND r2.approved = 'YES'
)

要解決該錯誤,請使用LEFT JOIN / NULL模式。

UPDATE request AS r1
LEFT JOIN request AS r2 ON r2.time = r1.time AND r2.id != r1.id AND r2.approved = 'YES'
SET r1.approved = 'YES'
WHERE r1.id = 3 AND r2.id IS NULL

您所使用的exists不正確。 但是在mysql中,您無法在from子句中指定要更新的表,因此無論如何都無法使用它。

但是您可以使用join 因此,對於您的簡單版本,它將是:

update requests r1
left join requests r2
on r1.id <> r2.id and r1.time = r2.time and r2.Approved = 'YES'
set r1.Approved = 'YES'
where r1.id = 3 
and r2.id is null;

當然,您也可以為更復雜的版本使用聯接。 由於您想自己嘗試一下,因此明天(或如果您需要),我將為您添加解決方案。

或者,您可以先進行選擇。 在那里你可以使用exists 然后,您將能夠向用戶顯示錯誤消息。 因為如果已有條目,此更新將不執行任何操作。

select count(*) 
from requests r1
where r1.id = 3
and not exists 
  (select * from requests r2
   where r1.id <> r2.id and r1.time = r2.time and r2.Approved = 'YES'
  );

嘗試這樣的事情。 我正在從要批准的ID中選擇時間,然后檢查表中是否已經存在該時間,如果不存在,則批准==是,請進行更新。

update request
set
approved = 'YES'
where not exists(select 'yes' from request where time = 
(select time from request where id=1) and approved='YES')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM