用于更新表字段的复杂查询。这可能吗?

时间:2012-11-03 22:55:32

标签: mysql

我有两个名为Item and Inspection的数据库表。物品有很多检查。基本上,对物品进行检查,检查记录其“未破坏”与“破碎”的状态。对每个项目进行定期检查。

我想为Items表中名为“last_broken_at”的每条记录更新一个新添加的字段。需要将其更新为在该项目的最旧相关检验中找到的“已创建”日期时间,其中检验“状态”字段等于“已损坏”。

虽然通过单个MySQL更新语句肯定可以实现,但这里需要注意:

如果某个项目在某个时刻被修复并且检查发现该项目“未被破坏”,但后来发现该项目再次被“破坏”,则该项目的“last_broken_at”字段必须更新为“已创建”日期时间在检查状态“未破坏”后状态“被破坏”的检查。

基本上,Items表中的“last_broken_at”字段必须对其名称为true,它必须确实是我们知道Item从“not broken”变为“broken”的最接近的时间。

以下是表格的样子:

项目表

  • ID(INT)
  • created(DATETIME)
  • name(VARCHAR)
  • status(VARCHAR)注意:包含项目的最新状态,按照上次检查。
  • last_broken_at(DATETIME)

检查

  • id(INT)
  • created(DATETIME)
  • item_status(VARCHAR)
  • item_id(INT)

谢谢!

1 个答案:

答案 0 :(得分: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'
                                            )
                         )