MYSQL - 返回具有最大值的完整行并将其加入另一个表

Posted

技术标签:

【中文标题】MYSQL - 返回具有最大值的完整行并将其加入另一个表【英文标题】:MYSQL - Return the complete row with the maximum value for a group and join it to another table 【发布时间】:2021-04-21 22:33:01 【问题描述】:

我目前在使用 mysql 查询时遇到问题。我搜索了许多 *** 问题以寻找答案,但找不到答案。

问题: 我有两张桌子-

teams = |id(主键)|name|sigma|mu|

排名 = |match_id|team_id|mu|sigma|

teams 表包含 team_id、name 以及 sigma 和 mu(稍后会详细介绍)。 team.id 还可以作为队伍中 team_id 的外键。 Ranks 包含比赛 id 和球队 id 以及 mu 和 sigma。

基本上,我想为每个团队 id 找到最大的匹配 id,并将相应的 mu 和 sigma(来自排名表)分配给团队表中的正确团队。换句话说,我希望 team 表中的每个团队都有对应于最大 match_id 的 sigma 和 mu 值。

我尝试了下面的MYSQL命令:

-- these will serve as the basis for the procdures which update the teams...
SELECT
  MAX(ranks.match_id) as max_match,
  ranks.team_id as team_id,
  teams.id,
  teams.name,
  ranks.match_id,
  ranks.team_id,
FROM
  ranks
  JOIN teams ON teams.id = team_id
UPDATE
  teams
SET
  teams.mu = ranks.mu, teams.sigma = ranks.sigma
WHERE
  max_match = ranks.match_id
  AND team_id = ranks.team_id

这样做我得到一个错误。提前感谢您的帮助。

另外我担心我无法做到这一点可能是由于我对 MYSQL 的理解存在重大错误,所以任何帮助解释我出错的地方都将不胜感激。

【问题讨论】:

将示例表数据添加到您的问题中会更容易理解。 【参考方案1】:

如果我理解正确,您希望 update 具有“最近” mu 和 sigma 值的团队。您可以将updatejoin 和窗口函数一起使用:

update teams t join
       (select r.*,
               row_number() over (partition by team_id order by match_id desc) as seqnum
        from ranks r
       ) r
       using (team_id)
    set t.mu = r.mu,
        t.sigma = r.sigma
    where seqnum = 1;

【讨论】:

以上是关于MYSQL - 返回具有最大值的完整行并将其加入另一个表的主要内容,如果未能解决你的问题,请参考以下文章

完全外部加入 mySQL - 缺少行

mysql返回最大n个具有相同值的行

如何从一个表中检索一百万行并将其插入到另一个表中? [复制]

SQL:按行条目数排序并加入

SQL选择GROUP BY中具有最大值的完整行

MySQL 中的最大行数