【问题标题】:MySQL Calculate rank then update table from a resultMySQL计算排名然后从结果更新表
【发布时间】:2012-05-24 12:19:06
【问题描述】:

我的问题是我正在尝试计算所有用户条目,然后对它们进行排名。在对它们进行排名后,我想更新用户表以记录每个用户的排名。

表格:

userTbl

活动表

我整晚都在搜索,这就是我到目前为止所拥有的。

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 金

2 约翰

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 更新排名变化。

【问题讨论】:

  • 您能否在 sqlfiddle 上提供您的完整架构并明确您的问题
  • userTblactivityTbl 看起来像什么?
  • userTbl columns: userNum userName email rank activityTbl columns: actNum userName(FK) actName actDate actTime 我需要熟悉 sqlfiddle,因为我以前从未使用过它。我会尽快把东西弄上去的。

标签: mysql rank


【解决方案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);

【讨论】:

  • 感谢您的快速回复!我以前没有使用排名表。我会试试这个,我会告诉你的!
  • 谢谢!!!!这不是我想要的,但你肯定把我推向了正确的方向!!!!
  • 您不需要在数据库中创建单独的表,但它可能会有所帮助
猜你喜欢
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 2012-09-14
  • 1970-01-01
相关资源
最近更新 更多