2010-03-19 53 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

相關問題