4

このテーブル ( rank_list) があるとします。

+--------+--------+--------+--------+
|  Sub   |  Name  |  Rank  | Marks  |
+--------+--------+--------+--------+
|Math2   |Smith   |       1|      85|
|Math1   |John    |       1|      92|
|Math1   |Susan   |       2|      91|
|Math1   |Abc     |       3|    90.5|
+--------+--------+--------+--------+

これで、さらに 4 つの結果が得られました。これらを正しいランクに挿入する必要があります。また、ランクが 3 を超える結果も認めません。

Sub = Math2,    Name = Mile,  Marks = 86
Sub = Math1,    Name = Luna,  Marks = 92.5
Sub = Physics1, Name = Sakib, Marks = 88.75
Sub = Math1,    Name = Coolb, Marks = 65

Mile2位のマークがあるので、2位に入れますRank

ルナは最高点を獲得し、Rank1 を取得しAbcて削除されます (はい、削除されます)。

Sakib は Physics1 の出身で、現在物理学で 1 位であるため、直接挿入されます。

Coolb はトップ 3 に入っていないため、挿入されません。

MySQLクエリでこれを行いたいです。

を使用してこれを行うことができますPHPが、これには時間がかかります。したがって、SQL を使用してこれを行いたいと思います (挿入と削除を高速化するため)。そして、私はあなたの助けが必要です。前もって感謝します。

4

1 に答える 1

2

これは、MySQL でグループ化されたランキングを実行する方法から恥知らずに盗まれた例の一部です。

データベースの設計はあまり適していませんが、機能し、非常に多くの行に達するまで遅くなることはありません。遅すぎると感じた場合は、いつでもトリガーを使用して、一種の "具体化されたビュー」を現在のランキングで表示します。

テスト用フィドル: http://sqlfiddle.com/#!2/b2cd8/15

テーブルに基づく SQL:

SELECT Name, Sub, Marks, Rank
FROM
    (SELECT Name, Sub, Marks,
        @student:=CASE WHEN @last_sub <> Sub THEN 1 ELSE @student+1 END AS Rank,
        @last_sub:=Sub
    FROM
        (SELECT @student:= 0) AS s,
        (SELECT @class:= 0) AS c,
        (SELECT * 
            FROM rank_list
            ORDER BY Sub, Marks DESC
        ) AS temp
    ) AS temp2
WHERE Rank <= 3
于 2013-02-24T12:09:51.850 に答える