在对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
因此,假设上面的查询产生了:
Students Rank Grades ======================= Al 1 90 Amy 2 90 George 3 78 Bob 4 73 Mary 5 NULL William 6 NULL
即使Al和Amy的成绩相同,一个人的排名也比另一个高。艾米被偷走了。我如何才能使Amy和Al具有相同的排名,以使他们俩的排名都为1。而且,William和Mary没有参加考试。他们挤在教室里,在男孩的房间里抽烟。他们应该并列最后的位置。
正确的排名应该是:
Students Rank Grades ======================== Al 1 90 Amy 1 90 George 2 78 Bob 3 73 Mary 4 NULL William 4 NULL
如果有人有任何建议,请告诉我。
编辑 :这是MySQL 4.1+支持
采用:
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
您可以使用交叉连接(在MySQL中为不带任何条件的INNER JOIN)来声明和使用变量,而无需使用单独的SET语句。
SET
您需要COALESCE来正确处理NULL。