Come si gestiscono i legami Quando Classifica Risultati in MySQL?
-
21-09-2019 - |
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.
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.