2012-11-03 39 views
2

我有兩個名爲Item和Inspection的數據庫表。一個項目有很多檢查。基本上,對一件物品進行檢查,檢查記錄它是「未破碎」與「破碎」的狀態。定期檢查每個項目。複雜的查詢來更新表字段。這可能嗎?

我想更新Items表中每個記錄的新增字段,名稱爲「last_broken_at」。它需要更新爲在該項目的最早的相關檢驗中發現的「創建的」日期時間,其中檢驗「狀態」字段等於「中斷」。

雖然是通過一個單一的MySQL更新語句絕對是可能的,這裏是警告:

如果項目在某些時候修理和檢查中發現的項目是「無故障」,但後來發現要再次「破碎」,在檢查狀態「未損壞」之後,項目的「last_broken_at」字段必須更新爲狀態爲「中斷」的檢查的「創建」日期時間。

基本上,Items表中的「last_broken_at」字段必須符合它的名稱,它確實應該是最接近我們知道Item從「未中斷」到「中斷」的時間。

下面是桌子的樣子:

項目表

  • ID(INT)
  • 創建(DATETIME)
  • 名(VARCHAR)
  • 狀態(VARCHAR)注:包含該項目的最新狀態,根據上次檢查。
  • last_broken_at(DATETIME)

檢查

  • ID(INT)
  • 創建(DATETIME)
  • ITEM_STATUS(VARCHAR)
  • ITEM_ID(INT)

謝謝!

回答

0

Try:

UPDATE items t 
SET t.last_broke_at = (
          SELECT min(created) 
          FROM inspections t1 
          WHERE t.item_id=t1.item_id 
          AND status='broken' 
          AND NOT EXISTS (
              SELECT * 
              FROM inspections t2 
              WHERE t1.item_id = t2.item_id 
               AND t2.created> t1.created 
               AND t2.status = 'not broken' 
              ) 
         )