2

Item と Inspection という 2 つのデータベース テーブルがあります。Item には多くの検査があります。基本的に、検査はアイテムに対して行われ、検査は「壊れていない」対「壊れている」という状態を記録します。各項目について定期的な検査が行われます。

「last_broken_at」という Items テーブルの各レコードに新しく追加されたフィールドを更新したいと考えています。検査の「ステータス」フィールドが「壊れた」に等しい、そのアイテムの最も古い関連する検査で見つかった「作成された」日時に更新する必要があります。

これは、単一の MySQL update ステートメントを介して確実に可能ですが、注意点があります。

ある時点でアイテムが修理され、検査でアイテムが「壊れていない」ことが判明したが、後で再び「壊れている」ことが判明した場合、アイテムの「last_broken_at」フィールドを検査の「作成された」日時に更新する必要があります。ステータス「壊れていない」の検査後、ステータスが「壊れた」であった場合。

基本的に、Items テーブルの「last_broken_at」フィールドはその名前に忠実である必要があり、実際には、Item が「壊れていない」から「壊れた」に変わったことを知る最も近い時間でなければなりません。

テーブルは次のようになります。

品目表

  • ID (INT)
  • 作成されました (DATETIME)
  • 名前 (VARCHAR)
  • status (VARCHAR) 注: 最後の検査による、アイテムの最新のステータスが含まれます。
  • last_broken_at (DATETIME)

検査

  • ID (整数)
  • 作成されました (DATETIME)
  • item_status (VARCHAR)
  • item_id (整数)

ありがとう!!

4

1 に答える 1

0

試す:

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'
                                            )
                         )
于 2012-11-03T23:06:20.000 に答える