2010-03-19 17 views
7

¿Cómo se vincula una manija al clasificar los resultados en una consulta de mysql? He simplificado los nombres de tablas y columnas en este ejemplo, pero debería ilustrar mi problema:¿Cómo manejo los vínculos al clasificar los resultados en 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 

así que imagina la produce la consulta anterior:

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

A pesar de que Al y Amy tienen el mismo grado, uno se clasifica más alto que el otro. Amy fue estafado. ¿Cómo puedo hacerlo para que Amy y Al tengan el mismo ranking, para que ambos tengan un rango de 1. Además, William y Mary no tomaron el examen? Empacaron clase y fumaban en la habitación de los niños. Deberían estar atados por el último lugar.

La clasificación correcta debe ser:

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

Si alguien tiene algún consejo, por favor hágamelo saber.

Respuesta

16

EDITAR: Este es MySQL 4.1+ apoyado

Uso:

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 

Se puede utilizar una combinación cruzada (en MySQL, Una unión interior sin ningún criterio) para declarar y usar una variable sin usar una declaración separada SET.

Necesita el COALESCE para manejar correctamente los valores NULL.

+0

Hi OMG Ponies, ¡¡Eres el Terminador de MySQL !! Impresionante, muchas gracias por la ayuda. Nunca lo hubiera averiguado. (Mi conocimiento SQL es básico, así que tendré que estudiar su respuesta para entenderlo mejor). Además, me encanta su nombre de usuario. ¡¡¡De nuevo, GRACIAS !!! -Laxmidi – Laxmidi

+0

"Puedes usar una combinación cruzada (en MySQL, una UNIÓN INTERNA sin ningún criterio) para declarar y usar una variable sin usar una declaración SET por separado". Maldita sea, no tenía idea de que pudieras hacer esto. +1 – heisenberg

+0

Votaría esto de nuevo si pudiera. Espectacular. – duffymo

1

Suena como una regla de middleware que se expresaría mejor en el código que se encontraba entre la base de datos y el cliente.

Si eso no es posible, recomendaría un procedimiento almacenado en MySQL para ejecutar la consulta tal como la escribiste y luego modificar los resultados usando un cursor y una matriz.

+0

Hola duffymo, Gracias por su comentario. Aprecio la ayuda. -Laxmidi – Laxmidi

+0

OMG Ponies es el hombre en este caso. Qué gran respuesta. – duffymo

Cuestiones relacionadas