【问题标题】:"Merging" two rows by taking the lowest column value in MySQL [duplicate]通过采用 MySQL 中的最低列值“合并”两行 [重复]
【发布时间】: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 没有足够的信心来确定。

【问题讨论】:

    标签: mysql sql group-by greatest-n-per-group sql-delete


    【解决方案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 的行
    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 2021-12-21
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多