【问题标题】:SQL query to populate index field based on groups基于组填充索引字段的 SQL 查询
【发布时间】:2011-04-15 10:58:58
【问题描述】:

我对 sql 还很陌生,希望有人可以帮助我进行更新查询。我有一个包含 group_id (外键)、 user_id 和 user_index 列的用户表。每个单独的group_id对应多个用户,user_id是一个从1到表大小的连续列。

我正在寻找一个将更新 user_index 列的查询,以便对于每个 group_id,每个用户都有一个从 1 开始的唯一顺序索引。因此在组 1 中会有 user_index 1、2、3。 .. 在第 2 组中会有 user_index 1,2,3... 等等。这是一个澄清的例子:

初始状态:

user_id | group_id | user_index
1         1          0
2         1          0
3         1          0
4         2          0
5         3          0
6         3          0

想要的状态:

user_id | group_id | user_index
1         1          1
2         1          2
3         1          3
4         2          1
5         3          1
6         3          2

我希望这很清楚。这在 C 或 C++ 中很容易做到,但我想知道是否有办法在 sql 中做到这一点。

【问题讨论】:

  • 组成一个组的user_ids是否总是形成一个完整的序列?或者 group_id=4 可以是 user_id IN ( 7, 8, 20 ) 吗?
  • 它们不是一个完整的序列,通常由于行被删除而丢失了一些。

标签: sql


【解决方案1】:
UPDATE TableName
SET user_index = (SELECT COUNT(1) FROM TableName t2 
   WHERE t2.group_id = TableName.group_id AND t2.user_id <= TableName.user_id)

编辑:
在查看了作者的评论后,我创建了一个测试,看看这是不是正确的解决方案。这是测试:

CREATE TABLE #table (user_id int, group_id int, user_index int)

INSERT INTO #table VALUES (1, 1, 0)
INSERT INTO #table VALUES (2, 1, 0)
INSERT INTO #table VALUES (3, 1, 0)
INSERT INTO #table VALUES (4, 2, 0)
INSERT INTO #table VALUES (5, 3, 0)
INSERT INTO #table VALUES (6, 3, 0)

SELECT * FROM #table

UPDATE #table
SET user_index = (SELECT COUNT(1) FROM #table t2 
WHERE t2.group_id = #table.group_id AND t2.user_id <= #table.user_id)

SELECT * FROM #table

DROP TABLE #table

两次选择的输出与作者的两次选择完全相同——第一次作为开始状态,第二次作为期望的结果。

【讨论】:

  • 这似乎用该用户组中的用户数更新 user_index(例如,如果组 1 中有 12 个用户,则每个用户的 user_index 设置为 12)。不过,我会更深入地研究它。
  • 不,如果您仔细观察 WHERE 子句的另一部分,它会将其设置为同一组中具有 user_id
  • 当我运行查询时,它用我提到的每个组中的用户总数更新了 user_index。看起来已经很接近了,但还没有达到预期的效果。
  • 我用我在答案中输入的代码对其进行了测试(这里不适合),结果与您想要的结果相同。
  • 我也尝试了您的示例,它绝对适用于我提供的示例数据。我的实际数据有点复杂,我仍然在让它工作时遇到一些问题,但我应该能够根据你的建议让它工作。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2013-04-11
  • 2020-05-27
  • 2013-11-03
  • 2013-07-06
  • 2013-08-11
  • 2012-11-24
  • 2018-09-13
  • 2021-10-13
相关资源
最近更新 更多