如何使用MySQL中最近关联记录的id更新外键

时间:2013-11-18 23:52:52

标签: mysql sql

从具有相同user_id的条目生成检查表latest_entry_id的最高性能的方法是什么,其中最新的start_date位于检查的create_date之前?

之前:

检查表

id        |   user_id |  create_date |  latest_entry_id  
------------------------------------------------------
1         |   1       | 2012-01-01   | NULL 
2         |   2       | 2012-01-01   | NULL

条目表

id         |   user_id |  start_date 
-------------------------------------
1          |   1       | 2012-02-01         
2          |   1       | 2011-01-01        
3          |   2       | 2011-09-01        
4          |   2       | 2011-10-01        

后:

检查表

id        |   user_id |  create_date |  latest_entry_id  
------------------------------------------------------
1         |   1       | 2012-01-01   | 2
2         |   2       | 2012-01-01   | 4

2 个答案:

答案 0 :(得分:0)

我想出的最佳查询是

Update checks INNER JOIN 
  (
    SELECT checks.id AS c_id, MAX(entries.start_date) AS max_start_date
    FROM checks LEFT OUTER JOIN entries ON checks.user_id = entries.user_id
    WHERE entries.start_date < checks.create_date
    GROUP BY checks.id
  ) AS tmp
ON checks.id = tmp.c_id
LEFT JOIN entries
ON tmp.max_start_date = entries.start_date AND checks.user_id = entries.user_id
SET checks.latest_entry_id = entries.id

此查询具有高性能,避免每次检查运行一个子查询。如果您知道另一种高效的方式来进行此更新以获得相同的结果,我想听听您的说法。

答案 1 :(得分:0)

我认为这可以使它发挥作用:

UPDATE checks c
INNER JOIN (
  SELECT e.user_id,
    MAX(e.id) AS ID
  FROM entries e
  INNER JOIN checks c1 ON e.user_id = c1.user_id
    AND e.start_date < c1.create_date
  GROUP BY e.user_id
  ) a ON a.user_id = c.user_id    
SET c.latest_entry_id = a.id;

sqlfiddle demo

P.S。您预期结果中的第二行与您的要求不符。 latest_entry_id应为4,而不是3。