2017-04-18 2 views
1

J'ai une requête qui positionne les étudiants en fonction de leurs moyennes, cette requête mysql fonctionne bien lors de l'interrogation des positions pour l'ensemble de la classe. Mais lorsque, par exemple, je veux un poste pour un étudiant en particulier, la requête classe celui-ci en position un, même dans la liste où l'étudiant ne se positionne pas.Liste correctement la position des marques d'étudiants dans la base de données

Ci-dessous la requête, lors d'une requête pour l'ensemble de la classe. Ici ça marche bien.

SELECT (@rownum := @rownum + 1) AS rank, student_id, 
    student_name,term_1_avg 
    FROM `students` a CROSS JOIN 
    (SELECT @rownum := 0) params 
    WHERE class = 2 
    ORDER BY term_1_avg DESC 

Mais lorsque la requête est comme ce

SELECT (@rownum := @rownum + 1) AS rank, student_id, 
    student_name,term_1_avg 
    FROM `students` a CROSS JOIN 
    (SELECT @rownum := 0) params 
    WHERE class = 2 and student_id=2013494 
    ORDER BY term_1_avg DESC 

il se classera le nombre d'étudiants 1, même si l'étudiant est la position pas.

Comment puis-je modifier la requête de sorte que lorsque je interroge un étudiant, il montre la position qu'il/elle est dans la classe entière.

Répondre

1

Votre classement est fait par la requête, de sorte que vous devez garder la requête comme et l'utiliser comme une sous requête

SELECT * FROM 
(SELECT 
    (@rownum := @rownum + 1) AS rank, 
    student_id, 
    student_name, 
    term_1_avg 
FROM `students` a 
CROSS JOIN (SELECT @rownum := 0) params 
WHERE class = 2 
ORDER BY term_1_avg DESC) as sub 
WHERE sub.student_id=2013494 
0

Peut-être ceci:

Select * 
from (SELECT (@rownum := @rownum + 1) AS rank, student_id, 
     student_name,term_1_avg 
     FROM `students` a CROSS JOIN 
     (SELECT @rownum := 0) params 
     WHERE class = 2 
     ORDER BY term_1_avg DESC) 
where student_id=2013494