Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于组填充索引字段的SQL查询_Sql - Fatal编程技术网

基于组填充索引字段的SQL查询

基于组填充索引字段的SQL查询,sql,Sql,我对sql相当陌生,希望有人能帮助我进行更新查询。我有一个users表,其中包含group\u id外键、user\u id和user\u索引列。每个组_id对应多个用户,用户_id是一个从1到表大小的串行列 我正在寻找一个将更新user\u index列的查询,这样,对于每个group\u id,每个用户都将有一个唯一的顺序索引,从1开始。所以在第1组中会有用户索引1,2,3。。。在第2组中会有用户指数1,2,3。。。等等下面是一个例子来说明: 初始状态: user_id | group_id

我对sql相当陌生,希望有人能帮助我进行更新查询。我有一个users表,其中包含group\u id外键、user\u id和user\u索引列。每个组_id对应多个用户,用户_id是一个从1到表大小的串行列

我正在寻找一个将更新user\u index列的查询,这样,对于每个group\u id,每个用户都将有一个唯一的顺序索引,从1开始。所以在第1组中会有用户索引1,2,3。。。在第2组中会有用户指数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中是否有一种方法可以做到这一点。p>
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

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

组成组的用户ID是否总是形成一个完整的序列?或者组_id=4可能是7、8、20中的用户_id吗?它们不是一个完整的序列,通常由于行被删除而丢失。这似乎是用该用户组中的用户数更新用户_索引,例如,如果组1中有12个用户,则每个用户的用户_索引都设置为12。不过,我会更深入地研究它。不,如果你仔细看WHERE子句的另一部分,它会将它设置为同一组中具有user_id的用户数。当我运行查询时,它会用我提到的每个组中的用户总数更新user_索引。它看起来非常接近,但还没有给出期望的结果。我用我在答案中输入的代码对其进行了测试,结果与您期望的结果相同。我也尝试了您的示例,它肯定能与我提供的示例数据一起工作。我的实际数据有点复杂,我仍然有一些问题让它工作,但我应该能够让它工作的基础上,你的建议。谢谢你的帮助!