Как я Обрабатываю Связи При Рейтинге Результатов в MySQL?

Как каждый обрабатывает связи при рейтинге результатов в запросе 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

Даже при том, что у Al и Amy есть тот же класс, каждый оценивается выше, чем другой. Amy была разорвана - прочь. Как я могу сделать его так, чтобы у Amy и Al был тот же рейтинг, так, чтобы у них обоих был разряд 1. Кроме того, William и Mary не взяли тест. Они сложили класс в мешок и курили в комнате мальчика. Они должны быть связаны для последнего места.

Корректный рейтинг должен быть:

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

Если у кого-либо есть совет, сообщите мне.

7
задан a_horse_with_no_name 17 November 2014 в 07:57
поделиться

2 ответа

РЕДАКТИРОВАТЬ : Поддерживается 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 ВНУТРЕННЕЕ СОЕДИНЕНИЕ без каких-либо критериев) объявлять и использовать переменную без использования отдельного оператора SET .

Вам нужен COALESCE для правильной обработки NULL.

16
ответ дан 6 December 2019 в 11:48
поделиться

Похоже на правило промежуточного программного обеспечения, которое лучше было бы выразить в коде, который находится между базой данных и клиентом.

Если это невозможно, я бы рекомендовал хранимую процедуру в MySQL для выполнения запроса в том виде, в котором вы его написали, а затем изменить результаты с помощью курсора и массива.

1
ответ дан 6 December 2019 в 11:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: