Как каждый обрабатывает связи при рейтинге результатов в запросе 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
Если у кого-либо есть совет, сообщите мне.
РЕДАКТИРОВАТЬ : Поддерживается 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.
Похоже на правило промежуточного программного обеспечения, которое лучше было бы выразить в коде, который находится между базой данных и клиентом.
Если это невозможно, я бы рекомендовал хранимую процедуру в MySQL для выполнения запроса в том виде, в котором вы его написали, а затем изменить результаты с помощью курсора и массива.