我的问题是我正在尝试计算所有用户条目,然后对它们进行排名。在对它们进行排名后,我想更新users表以记录每个用户的排名。
表:
userTbl
activityTbl
我整夜都在搜索,这是我到目前为止所做的。
SET @rank := 0;
SELECT * FROM (
SELECT @rank := @rank + 1 AS rank, a.userName
FROM activityTbl a
LEFT JOIN userTbl u ON a.userName = u.userName
GROUP BY a.userName
ORDER BY SUM( TIME_TO_SEC( a.actTime ) )DESC
) as sub
返回:
秩|用户
1 Kim
2 John
3乔
这很好,但我尝试将Update和Set添加到此查询以更新userTbl,我无法让它工作。
请帮忙!如果您需要更多信息,请与我们联系。
更新:
对于那些正在寻找我所做的事来纠正我的问题的人。
首先,我发布了错误的MySQL。我用来解决问题的方法是:
SET @rownum := 0;
SELECT @rownum := @rownum + 1 AS rank, userName, actTimeTotal
FROM (SELECT SUM(TIME_TO_SEC(actTime)) AS actTimeTotal , userName
FROM activityTbl
GROUP BY userName
ORDER BY actTimeTotal DESC) as result
其次,我创建了一个名为rankTbl的排名表,其中包含2列:rank smallInt和userName varchar。
第三,将MySql脚本修改为:
SET @rownum := 0;
INSERT INTO rankTbl( rank, userName)
SELECT @rownum := @rownum + 1 AS rank, userName
FROM (SELECT SUM(TIME_TO_SEC(actTime))AS actTimeTotal , userName
FROM activityTbl
GROUP BY userName
ORDER BY actTimeTotal DESC) as result
ON DUPLICATE KEY UPDATE userName = VALUES(userName);
我将ON DUPLICATE KEY UPDATE更改为userName而不是rank。当排名改变时,排名没有为userName更新。使用userName更新排名更改。
答案 0 :(得分:1)
您需要做的是确保您的排名表具有用户的主键,然后使用KEY错误提供发出SELECT的INSERT:
假设您的表名为tbl
且包含rank
字段和user
字段,我基本上说的是您需要以下查询才能返回所有行的重复键错误:
SET @rank := 0;
INSERT INTO tbl (rank, user)
SELECT @rank := @rank + 1 AS rank, a.userName
FROM activityTbl a
LEFT JOIN userTbl u ON a.userName = u.userName
GROUP BY a.userName
ORDER BY SUM(TIME_TO_SEC(a.actTime)) DESC;
如果你有这个并且你确定它为它试图插入的所有行返回重复键错误,你可以按如下方式修改它:
SET @rank := 0;
INSERT INTO tbl (rank, user)
SELECT @rank := @rank + 1 AS rank, a.userName
FROM activityTbl a
LEFT JOIN userTbl u ON a.userName = u.userName
GROUP BY a.userName
ORDER BY SUM(TIME_TO_SEC(a.actTime)) DESC
ON DUPLICATE KEY UPDATE rank = VALUES(rank);