使用join和max更新行

时间:2015-03-31 09:18:05

标签: mysql join sql-update max

我有以下两个表(简化架构):

score
-----
id
score

score_history
-------------
id
score_id (foreign key with score table)
score

我正在定期填充score_history表。我想更新分数表中的每一行,分数列基于score_history中与最大ID号相关联的分数。

一个例子可能是:

score entries
+----+-------+
| id | score |
+----+-------+
| 1  | 0     |
| 2  | 0     |
+----+-------+

score_history entries
+----+----------+-------+
| id | score_id | score |
+----+----------+-------+
| 1  | 1        | 15    |
| 2  | 2        | 10    |
| 3  | 1        | 14    |
| 4  | 2        | 11    |
+----+----------+-------+

在score_history中存在3/4条目之前,我想在一个请求中将得分表中的得分更新为以下内容:

+----+-------+
| id | score |
+----+-------+
| 1  | 15    |
| 2  | 10    |
+----+-------+

在score_history中插入3/4条目后,我再次希望我的分数表具有相同的请求:

+----+-------+
| id | score |
+----+-------+
| 1  | 14    |
| 2  | 11    |
+----+-------+

我尝试了多项内容(例如https://stackoverflow.com/a/9396897/916630)但无法取得成功。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

UPDATE score s
SET score = 
   (SELECT score FROM score_history sh WHERE sh.score_id = s.ID  ORDER BY SH.id ASC LIMIT 1)

答案 1 :(得分:1)

update score 
join score_history on score.id = score_history.score_id 
join 
(select score_id, max(id) mid
from score_history
group by score_id) t
on score_history.id = t.mid
set score.score = score_history.score 

首先获取历史记录表中每个score_id的max(history_id)。

然后使用max id加入历史记录。

最后加入得分表并将得分列设置为具有最大ID

的得分

答案 2 :(得分:1)

如果您正在寻找更新命令,可以将其作为

update 
score s 
join score_history sh on sh.score_id = s.id 
join ( 
  select max(id) as max_id, score_id  from score_history group by score_id
)x on x.max_id = sh.id and x.score_id = sh.score_id 
set s.score = sh.score ;