2012-05-24 54 views
2

我的問題是我想要計算所有的用戶條目,然後排名他們。在我排列它們之後,我想更新用戶表來記錄每個用戶的等級。MySQL計算等級然後從結果更新表

表:

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金

約翰二

3喬

這是好的,但我試圖添加更新並設置爲此查詢更新userTbl,我只是無法讓它工作。

請幫忙!如果您需要更多信息,請與我們聯繫。

UPDATE:

對於那些尋找正是我所做的糾正我的問題。

首先,我發佈了錯誤的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列:排名SMALLINT和用戶名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); 

我改變了對重複密鑰更新至USERNAME,而不是排名。當等級改變時,用戶名的等級沒有更新。在等級中使用userName更新更改。

+0

您可以提供完整的模式上sqlfiddle你的問題澄清的 –

+0

做什麼的'userTbl'和'activityTbl'看喜歡? –

+0

userTbl列:userNum用戶名電子郵件排名activityTbl列:actNum用戶名(FK)actName actDate actTime我需要熟悉sqlfiddle,因爲我從來沒有用過它。我會盡力在那裏得到一些東西。 – korenzo

回答

1

你需要做的是確保你的排名表對用戶的主鍵,然後發出SELECT的INSERT用鑰匙錯誤規定:

Asuming你的表名爲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); 
+0

感謝您的快速響應!我之前沒有使用排名表。我會試試這個,我會讓你知道! – korenzo

+0

謝謝!!!!!這不是我正在尋找的,但你絕對推動我正確的方向! – korenzo

+0

您不需要在數據庫中創建單獨的表格,但它可能有幫助 – Toote