"Merging" 两行取 MySQL 中的最低列值

"Merging" two rows by taking the lowest column value in MySQL

我有一个 MySQL table 类似于:

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

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

有时,我想“合并”两个用户。假设我们将用户 2 合并到用户 1。我想要做的是为每个多维数据集大小获取用户 1 和 2 的最低 solveTime 并删除用户 2 的行。结果是:

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

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

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

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

或者,如果您是 运行 MySQL 8.0,您可以使用 window 功能:

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

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

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