2010-03-19 50 views
7

如何在将结果排序为mysql查询时处理关系?我已经简化在这个例子中,表名和列,但它应该说明我的问题:如何在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和艾米具有相同一级排名高于另一级。艾米被扯掉了。我怎么能这样做,以便艾米和艾尔有相同的排名,所以他们都有1的排名。另外,威廉和玛丽没有参加测试。他们上课并在男孩的房间里吸烟。他们应该被绑在最后一个地方。

正确的排序应该是:

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

如果任何人有任何建议,请让我知道。

回答

16

编辑:这是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声明。

您需要COALESCE正确处理NULL。

+0

嗨OMG小马, 你是MySQL终结者!太棒了,非常感谢你的帮助。我从来不会想到它。 (我的SQL知识很基础,所以我必须研究你的答案才能更好地理解它)。 另外,我喜欢你的屏幕名称。 再次感谢! “ -Laxmidi – Laxmidi 2010-03-19 02:23:40

+0

”您可以使用交叉连接(在MySQL中,没有任何条件的INNER JOIN)来声明和使用变量,而不使用单独的SET语句。“该死的,我不知道你能做到这一点。 +1 – heisenberg 2010-03-19 03:11:34

+0

如果可以的话,我会再次投票。壮观。 – duffymo 2010-03-19 12:05:50

1

听起来像一个中间件规则,它可以更好地表达在数据库和客户端之间的代码中。

如果这是不可能的,我建议在MySQL中存储过程来运行查询,然后使用游标和数组修改结果。

+0

Hi duffymo, 感谢您的评论。我很感激帮助。 -Laxmidi – Laxmidi 2010-03-19 02:24:27

+0

OMG小马是这个人的人。多好的答案。 – duffymo 2010-03-19 12:05:10

相关问题