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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top