7

ランク付けの結果が mysql クエリになる場合、同点をどのように処理しますか? この例では、テーブル名と列を簡略化しましたが、問題を説明する必要があります。

SET @rank=0;

   SELECT student_names.students, 
          @rank := @rank +1 AS rank, 
          scores.grades
     FROM student_names  
LEFT JOIN scores ON student_names.students = scores.students
 ORDER BY scores.grades DESC

したがって、上記のクエリが生成するものを想像してください。

Students  Rank  Grades
=======================
Al         1     90
Amy        2     90
George     3     78
Bob        4     73
Mary       5     NULL
William    6     NULL

アルとエイミーは同じ学年なのに、どちらかが上位。エイミーはだまされた。どうすればエイミーとアルのランクが同じになり、どちらもランクが 1 になるようにできますか。また、ウィリアムとメアリーはテストを受けませんでした。彼らはクラスを袋詰めし、男の子の部屋で喫煙していました. 彼らは最後の場所で結ばれるべきです。

正しいランキングは次のとおりです。

Students  Rank  Grades
========================
Al         1     90
Amy        1     90
George     2     78
Bob        3     73
Mary       4     NULL
William    4     NULL

誰かアドバイスがあれば教えてください。

4

2 に答える 2

16

編集:これはMySQL 4.1+がサポートされています

使用する:

   SELECT st.name,
          sc.grades,
          CASE 
            WHEN @grade = COALESCE(sc.grades, 0) THEN @rownum 
            ELSE @rownum := @rownum + 1 
          END AS rank,
          @grade := COALESCE(sc.grades, 0)
     FROM STUDENTS st
LEFT JOIN SCORES sc ON sc.student_id = st.id
     JOIN (SELECT @rownum := 0, @grade := NULL) r
 ORDER BY sc.grades DESC

クロス結合 (MySQL では基準のない INNER JOIN) を使用して、別のSETステートメントを使用せずに変数を宣言して使用できます。

NULL を適切に処理するには COALESCE が必要です。

于 2010-03-19T01:30:35.273 に答える
1

データベースとクライアントの間に位置するコードでより適切に表現されるミドルウェア ルールのように思えます。

それが不可能な場合は、MySQL のストアド プロシージャを使用して、作成したとおりにクエリを実行し、カーソルと配列を使用して結果を変更することをお勧めします。

于 2010-03-19T01:07:19.473 に答える