簡體   English   中英

用SELECT語句更新列

[英]Update column with SELECT statement

我需要一個查詢來更新選擇(計數)語句中的列。

這就是我嘗試過的

SELECT m.MaidID, m.MaidJobCompleted, count(m.MaidName) as countMaidJobCompleted
FROM  Booking b, Maid m 
WHERE b.BookingMaidID like concat("%",m.MaidName,"%") 
and b.BookingStatus="completed"
group by MaidName

獲得正確的結果:

MaidID  MaidJobCompleted    countMaidJobCompleted   
329        0                     5  
188        0                     1  
281        0                     8  
229        0                     4  

MaidJobCompleted是我創建的列(默認值為0)。 countMaidJobCompleted是從上面的查詢獲取的列。


女佣

MaidIDPrimary       int(100)     ,autoIncrement eg(1,2,3,4,5..)
MaidJobCompleted    int(100)     ,default value = 0
MaidName            varchar(200) ,eg(Batman,Spiderman,WonderWoman,Indiana John)

預訂

BookingID           int(100)     ,autoIncrement eg(1,2,3,4,5..)
BookingMaidID       varchar(500) ,eg(Batman,Wonderwoman,Ironman)
BookingStatus       varchar(50)  ,eg(completed,pending..)

MaidID  MaidJobCompleted    countMaidJobCompleted   
329        0                     5  
188        0                     1  
281        0                     8  
229        0                     4  

現在,我想使用UPDATE查詢根據'countMaidJobCompleted'更新'MaidJobCompleted'列。

首先,您應該標准化表格。 這意味着很多事情,但是在您的上下文中,我看到在表Maid中,需要計算MaidJobCompleted列。 這是禁忌。 您最終可能會獲得不同步的值(例如,新的預訂已完成,但該計算的值未更新)。 但是有一種方法可以確保不會發生這種情況。 繼續閱讀...

另一個問題,BookingMaidID應該是一個數字,它是Maid表中MaidID的前鍵。 您正在將名稱與ID混合在一起。

我向您建議的是:

女佣表:

MaidID              int(100)     -- autoIncrement
MaidName            varchar(200) -- some name

預訂表:

BookingID           int(100)     -- autoIncrement
MaidID              int(100)     -- foreign-key to Maid:MaidID     
StatusID            int(100)     -- foreign-key to Status:StatusID

狀態表:

StatuID            int(100)      -- autoIncrement
StatusName         varchar(200)  -- some values, ex.completed,pending..

細節:

  • 您應該沒有需要計算的列值。 在需要時使用查詢來執行此操作。
  • 添加了狀態表,以確保您可以控制預訂表(和應用程序)中允許的有效狀態值。
  • 如果您需要知道所有女佣已經完成了多少預訂,請使用以下方法:

     SELECT b.MaidID, m.MaidName, COUNT(b.BookingID) FROM Booking AS b JOIN Maid AS m ON b.MaidID = m.MaidID JOIN Status AS s ON b.StatusID = s.StatusID WHERE b.StatusID = (SELECT StatusID FROM Status WHERE StatusName = 'Completed') 
  • 或者,如果您需要了解1個特定的女仆,請按如下所示進行修改:

     SELECT COUNT(b.BookingID) FROM Booking AS b JOIN Maid AS m ON b.MaidID = m.MaidID JOIN Status AS s ON b.StatusID = s.StatusID WHERE b.StatusID = (SELECT StatusID FROM Status WHERE StatusName = 'Completed') AND m.MaidName = 'THE-NAME-YOU-WANT' 

讓我們來解釋一下該查詢:

  • 在“預定”表中,您可以計算完成的女佣的預定數量。
  • 顯示女仆的名字會很好,因此請加入女仆表以獲取名字。
  • 由於狀態值在它們自己的表中,因此也請加入狀態表。

免責聲明我直接在此處輸入查詢,而無需在示例數據庫上進行測試。

用您的原始查詢(成為子查詢)INNER JOIN您的maid表,然后使用countMaidJobCompleted來更新您的maid.MaidJobCompleted列:

UPDATE maid 
  INNER JOIN
(SELECT m.MaidID, m.MaidJobCompleted, count(m.MaidName) as countMaidJobCompleted
FROM  Booking b, Maid m 
WHERE b.BookingMaidID like concat("%",m.MaidName,"%") 
and b.BookingStatus="completed"
group by MaidName) t
  ON maid.MaidID=t.MaidID
SET maid.MaidJobCompleted=t.countMaidJobCompleted;

暫無
暫無

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

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