2

私の問題は、すべてのユーザーエントリを計算してからランク付けしようとしていることです。それらをランク付けした後、各ユーザーのランクを記録するためにユーザーテーブルを更新したいと思います。

テーブル:

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キム

2ヨハネ

3ジョー

これは問題ありませんが、userTblを更新するためにこのクエリにUpdate and Setを追加しようとしましたが、動作させることができません。

助けてください!さらに情報が必要な場合はお知らせください。

アップデート:

問題を修正するために私がしたことを正確に探している人のために。

まず、間違った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

次に、ranksmallIntとuserNamevarcharの2つの列を持つrankTblというランクテーブルを作成しました。

第三に、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 DUPLICATEKEYUPDATEをrankではなくuserNameに変更しました。ランクが変更されたとき、userNameのランクは更新されませんでした。userNameを使用すると、ランクが変更されます。

4

1 に答える 1

1

あなたがする必要があるのは、あなたのランキングテーブルがユーザーの主キーを持っていることを確認してから、KEYエラープロビジョニングでSELECTのINSERTを発行することです:

テーブルに名前が付けられ、フィールドとフィールドtblが含まれていると仮定すると、基本的に言っているのは、すべての行に対して重複キーエラーを返すには次のクエリが必要だということです。rankuser

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);
于 2012-05-24T12:37:26.373 に答える