Comment gérer les liens lors du classement Résultats dans MySQL?
-
21-09-2019 - |
Question
Comment peut-on les liens de poignée lors du classement des résultats dans une requête MySQL? J'ai simplifié les noms des tables et des colonnes dans cet exemple, mais il devrait illustrer mon problème:
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
Alors, imaginez la requête ci-dessus la produit:
Students Rank Grades
=======================
Al 1 90
Amy 2 90
George 3 78
Bob 4 73
Mary 5 NULL
William 6 NULL
Bien que Al et Amy ont le même grade, on est classé plus haut que l'autre. Amy a escroqués-off. Comment puis-je faire en sorte que Amy et Al ont le même classement, de sorte qu'ils ont tous deux un rang 1. En outre, William et Mary n'a pas pris le test. Ils mis en sac classe et étaient fumeurs dans la chambre du garçon. Ils devraient être à égalité pour la dernière place.
Le classement correct devrait être:
Students Rank Grades
========================
Al 1 90
Amy 1 90
George 2 78
Bob 3 73
Mary 4 NULL
William 4 NULL
Si quelqu'un a des conseils, s'il vous plaît laissez-moi savoir.
La solution
EDIT : Ceci est MySQL 4.1+ supporté
Utilisation:
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
Vous pouvez utiliser une jointure croisée (MySQL, un INNER JOIN sans aucun critère) pour déclarer et utiliser une variable sans utiliser une instruction séparée SET
.
Vous avez besoin COALESCE pour gérer correctement les valeurs NULL.
Autres conseils
Sons comme une règle de middleware qui serait mieux exprimé dans le code qui était assis entre la base de données et le client.
Si ce n'est pas possible, je vous recommande une procédure stockée dans MySQL pour exécuter la requête que vous avez écrit et modifier ensuite les résultats à l'aide d'un curseur et un tableau.