【问题标题】:Complex query to update table field. Is this possible?更新表字段的复杂查询。这可能吗?
【发布时间】:2012-10-24 05:44:30
【问题描述】:

我有两个名为 Item 和 Inspection 的数据库表。一个项目有许多检查。基本上,对一个项目进行检查,检查记录它的状态是“未损坏”还是“损坏”。对每个项目进行定期检查。

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

虽然这绝对可以通过单个 MySQL 更新语句来实现,但需要注意的是:

如果某个项目在某个时间被修复并且检查发现该项目“没有损坏”,但后来又发现“损坏”,则该项目的“last_broken_at”字段必须更新为“created”日期时间在检查状态为“未损坏”后状态为“损坏”的检查。

基本上,Items 表中的“last_broken_at”字段必须与其名称相符,它确实必须是我们知道 Item 从“未损坏”变为“损坏”的最接近时间。

这些表格如下所示:

项目表

  • ID (INT)
  • 已创建(日期时间)
  • 名称(VARCHAR)
  • status (VARCHAR) 注意:包含项目的最新状态,根据上次检查。
  • last_broken_at (DATETIME)

检查

  • id (INT)
  • 已创建(日期时间)
  • item_status (VARCHAR)
  • item_id (INT)

谢谢!!

【问题讨论】:

    标签: mysql


    【解决方案1】:

    试试:

    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'
                                                )
                             )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多