通过采用 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 中的最低列值“合并”两行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章