【问题标题】:MySQL convert duplicate field entries to duplicate incrementing valueMySQL 将重复的字段条目转换为重复的递增值
【发布时间】:2020-07-14 07:24:50
【问题描述】:

我目前有一个表,其中包含多个条目的 parent_id 字段,即 4 个条目的相同 ID 号(如下面的屏幕截图所示)。我想将 parent_id 转换为从 9000 向上运行,因此在屏幕截图中,000004 将在 4 个条目中变为 9000,000007 将在 4 个条目中变为 9001,依此类推(如示例结果所示)。有谁知道实现此功能的简单方法,因为我不想手动更改 2224 条目!?

提前谢谢各位!

表格截图:

示例结果:

【问题讨论】:

    标签: mysql sql select mysql-workbench


    【解决方案1】:

    如果你正在运行 MySQL 8.0,你可以使用 dense_rank() 来做这个:

    select
        t.*,
        8999 + dense_rank() over(order by parent_id) new_parent_id
    from mytable t
    

    在早期版本中,一个(效率较低的)选项使用相关子查询:

    select
        t.*,
        9000 + (select count(distinct t1.parent_i) from mytable t1 where t1.parent_id < t.parent_id) new_parent_id
    from mytable t
    

    【讨论】:

    • 目前在 MySQL Community 5.6.44 下的 AWS 上运行(不是我的选择),有没有办法在这个版本上做到这一点?
    • @TomBromley:好的,我用早期版本的解决方案更新了我的答案。
    【解决方案2】:

    您似乎想要update。如果是这样:

    update t join
           (select t.*, row_number() over (order by id) as seqnum
            from t
           ) tt
           on t.id = tt.id
        set t.parent_id = 9000 + floor( (seqnum - 1) / 4);
    

    请注意,这会忽略当前的parent_id,基于id 为4 行的组分配相同的值。

    编辑:

    在旧版本的 MySQL 中:

    update t join
           (select t.*, (@rn := @rn + 1) as seqnum
            from (select t.* from t order by id) t cross join
                 (select @rn := 0) params
           ) tt
           on t.id = tt.id
        set t.parent_id = 9000 + floor( (seqnum - 1) / 4);
    

    【讨论】:

    • 对不起,应该说,我们在 AWS 上运行 MySQL Community 5.6.44
    • @TomBromley 。 . .我使用row_number() 的原因之一是因为它很容易转换为变量。我添加了一个替代方案。
    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2020-11-03
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多