通过采用 MySQL 中的最低列值“合并”两行 [重复]

Posted

技术标签:

【中文标题】通过采用 MySQL 中的最低列值“合并”两行 [重复]【英文标题】:"Merging" two rows by taking the lowest column value in MySQL [duplicate] 【发布时间】:2020-12-26 21:57:47 【问题描述】:

我有一个类似这样的 mysql 表:

userId | cubeSize | solveTime
-----------------------------
1      | 5        | 24.34
2      | 5        | 35.6
1      | 8        | 130.04
2      | 8        | 125.30
3      | 15       | 405.23

表的复合主键是(userId, cubeSize)。

有时,我想“合并”两个用户。假设我们将用户 2 合并到用户 1。我想要做的是为每个立方体大小取用户 1 和 2 的最低求解时间,并删除用户 2 的行。结果是:

userId | cubeSize | solveTime
-----------------------------
1      | 5        | 24.34
1      | 8        | 125.30
3      | 15       | 405.23

有人对我如何实现这一目标有任何想法吗?我想它可能可以使用GROUP BY 在一两个查询中完成,但我对 SQL 没有足够的信心来确定。

【问题讨论】:

【参考方案1】:

如果您想要每个cubeSize 具有最小solveTime 的行,那么一个选项使用子查询进行过滤:

select t.*
from mytable t
where solveTime = (select min(t1.solveTime) from mytable t1 where t1.cubeSize = t.cubeSize)

或者,如果您运行的是 MySQL 8.0,则可以使用窗口函数:

select *
from (
    select t.*, rank() over(partition by cubeSize order by solveTime) rn
    from mytable t
) t
where rn = 1

如果你想删除“其他行”,那么:

delete t
from mytable t
inner join (
    select cubeSize, min(solveTime) minSolveTime
    from mytable
    group by cubeSize
) t1 
on t1.cubeSize = t.cubeSize and t1.minSolveTime < t.solveTime

【讨论】:

这就像一个魅力。我正在使用 MySQL 8,老实说,第一个选项看起来对我来说更有意义。但是,虽然这会返回我希望实际存在于表中的数据,但我如何将它与可能的一些 UPDATE/DELETE 语句结合起来以将数据提交到表中?例如。我希望编辑用户 1 的行以显示最短时间,并删除用户 2 的行 @DeeBo:请参阅我的更新答案以获取有关如何删除行的解决方案。 非常感谢。 (这个更新/删除部分使我的问题与“重复”不同)【参考方案2】:

我认为您只想按立方体大小分组并获得其他列的最小值。你可以这样做:

select min(userId), cubeSize, min(solveTime) from t group by cubeSize

【讨论】:

嗨,这个实际上不太好用。我认为min(userId) 部分不正确,因为它实际上并没有返回与最低solveTime 关联的userId,它只返回具有cubeSize 记录的最低userId 是的,这就是你想要的……还是不是?您的预期结果包括 1, 8, 125.30 - 这不是示例数据中的一行,而只是由多行组成的值。 哦,我明白你的意思了!对不起,脑子里一片空白。是的。虽然这会返回我希望实际出现在表中的数据,但我如何将它与大概的一些 UPDATE/DELETE 语句组合以将数据提交到表中?例如。我希望编辑用户 1 的行以显示最短时间,并删除用户 2 的行

以上是关于通过采用 MySQL 中的最低列值“合并”两行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将一列的列值组合到 MySQL 中的另一列中?

oracle中合并两行数据相加

将其他两行合并创建一个Mysql数据库

MySQL:通过其他表中的值更新列值

通过查找多个列值进行合并

MySQL,根据列值从不同的行中选择