Domanda

In che modo i legami una maniglia quando classifica i risultati in una query mysql? Ho semplificato i nomi delle tabelle e le colonne in questo esempio, ma dovrebbe illustrare il mio problema:

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

Quindi immaginate la query precedente produce:

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

Anche se Al e Amy hanno lo stesso grado, si è posizionato più in alto rispetto agli altri. Amy ha ottenuto strappato-off. Come posso fare in modo che Amy e Al hanno la stessa classifica, in modo che entrambi hanno un rango di 1. Inoltre, William e Mary non ha preso il test. Hanno insaccato di classe e fumavano nella camera del ragazzo. Essi dovrebbero essere legati per l'ultimo posto.

La corretta classificazione dovrebbe essere:

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

Se qualcuno ha qualche consiglio, per favore fatemelo sapere.

È stato utile?

Soluzione

Modifica : Questo è MySQL 4.1+ supportato

Usa:

   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

È possibile utilizzare un cross join (in MySQL, un INNER JOIN senza alcun criterio) di dichiarare e utilizzare una variabile senza utilizzare una dichiarazione SET separata.

È necessario il COALESCE per gestire correttamente i valori null.

Altri suggerimenti

suona come una regola di middleware che sarebbe meglio espresso in codice che era seduto tra il database e il client.

Se questo non è possibile, io consiglierei di una stored procedure in MySQL per eseguire la query come lo ha scritto e quindi modificare i risultati utilizzando un cursore e una serie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top