2010-09-21 13 views
2

我对sql相当陌生,并希望有人可以帮助我进行更新查询。我有一个group_id(外键),user_id和user_index列的用户表。有多个用户对应于每个单独的group_id,user_id是从1到表大小的串行列。SQL查询以基于组填充索引字段

我正在查询将更新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中执行此操作。

+0

包含组的user_id总是形成一个不间断的序列吗?或者group_id = 4可以是user_id IN(7,8,20)例如? – 2010-09-21 22:10:54

+0

它们不是一个不间断的序列,由于行被删除,往往会有一些缺失。 – Brysonic 2010-09-21 22:23:25

回答

2
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 

2所选择的输出是完全一样的作者的两大选择 - 第一是开始状态,第二个作为期望的结果。

+0

这似乎更新user_index与该用户组中的用户数量(例如,如果组1中有12个用户,那么每个用户的user_index设置为12)。不过,我会仔细考虑一下。 – Brysonic 2010-09-21 22:33:40

+0

不,如果您仔细观察WHERE子句的其他部分,它会将其设置为同一组中user_id <= user_id更新的行的用户数。组中具有最小ID的用户对于该计数的值具有1,而下一个最小的用户获得值2,等等。 – 2010-09-21 22:40:15

+0

当我运行查询时,它会按照我提到的每个组中的用户总数更新user_index。它似乎非常接近,但它还没有给出预期的结果。 – Brysonic 2010-09-22 17:29:40