【问题标题】:How to (re-)assign an incremental number to each database row, having one sequence per user?如何(重新)为每个数据库行分配一个增量编号,每个用户有一个序列?
【发布时间】:2022-08-19 16:54:40
【问题描述】:

我有一个存储用户图片的表格,以及它们应该出现的基于 1 的位置:

CREATE TABLE Picture (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  user_id INT UNSIGNED NOT NULL,
  position INT UNSIGNED NOT NULL,
  PRIMARY KEY (id),
  INDEX (user_id)
);

它目前充满了破碎的位置,例如:

id user_id position
1 1 1
2 1 2
3 1 3
4 1 5
5 1 6
6 1 7
7 1 7
8 1 8
9 2 2
10 2 3
... ... ...

如何将基于 1 的位置重新分配给每个用户的图片?同时保持原始position 顺序(模重复)。这样就变成了:

id user_id position
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
6 1 6
7 1 7
8 1 8
9 2 1
10 2 2
... ... ...

我只想用 SQL 查询来做到这一点。

可用于演示解决方案的测试数据:

INSERT INTO Picture VALUES
    (1, 1, 1),
    (2, 1, 2),
    (3, 1, 3),
    (4, 1, 5),
    (5, 1, 6),
    (6, 1, 7),
    (7, 1, 7),
    (8, 1, 8),
    (9, 2, 2),
    (10, 2, 3),
    (11, 2, 4),
    (12, 2, 5),
    (13, 2, 5),
    (14, 2, 5),
    (15, 2, 8),
    (16, 2, 9),
    (17, 2, 10),
    (18, 2, 12),
    (19, 2, 12);

请不要依赖id 列进行订购id 的顺序在本例中只是偶然与position 的顺序相同,但实际表中并非如此。

    标签: mysql mysql-8.0


    【解决方案1】:

    我可能建议不要进行实际更新,而只是创建一个视图或选择生成您想要的position 输出。在 MySQL 8+ 上,我们可以在这里尝试使用ROW_NUMBER()

    SELECT id, user_id,
           ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY position, id) AS position
    FROM yourTable
    ORDER BY 2, 3;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-08
      • 2011-02-17
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      相关资源
      最近更新 更多