2010-09-21 73 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