2016-10-30 45 views
0
SELECT * 
FROM (SELECT id, user, MAX(score) FROM table_1 GROUP BY user) AS sub 
ORDER BY 'sub.score' ASC; 

此SQL查詢應從表中選擇一個用戶,而且每個用戶的評分最高,準確性最高。GROUP BY不起作用後的ORDER BY

表結構是這樣的:

+-----------------------+ 
| id | score | username | 
+-----------------------+ 
| 1 | 15 |  mike | 
| 2 | 23 |  tom | 
| 3 | 16 |  mike | 
| 4 | 22 |  jack | 

etc.. 

結果應該是這樣的:

3 mike 16 
2 tom 23 
4 jack 22 

然後重新排序:

3 mike 16 
4 jack 22 
2 tom 23 

但查詢不重新排序的子查詢得分了。如何做?

+0

我投這個遷移到#1。您不應該刪除或交叉發佈此問題在Stackoverflow。 –

+1

這將返回一個任意的編號 – Strawberry

+0

我認爲,你的子表中沒有**分數**,因爲你不給最大(分數)別名。 –

回答

2

讓我們來看看你正在一步做一步:

SELECT id, user, MAX(score) FROM table_1 GROUP BY user 

在這裏,您是通過用戶名進行分組,讓您得到一個每個用戶名的結果行。在此結果行中,您可以選擇用戶名,爲該用戶名(對於「mike」爲16)和爲用戶名找到的其中一個ID(對於「mike」可以是1或3) DBMS可以自由選擇一個)。這可能不是你想要的。

SELECT * FROM (...) AS sub ORDER BY 'sub.score' ASC; 

'sub.score'是一個字符串(單引號)。您想要通過子查詢中的最高分來排序。所以首先給max(score)一個名字,例如max(score) as max_score,然後訪問:ORDER BY sub.max_score ASC

無論如何,如果你想要一個用戶名得分最高的記錄(以便獲得相應的ID),你可以查找不存在具有相同用戶名和更高記錄的記錄得分了。然後排序很容易:因爲沒有彙總,您只需按分數排序:

select * from table_1 t1 where not exists 
    (select * from table_1 higher where higher.name = t1.name and higher.score > t1.score) 
order by score; 
+0

這顯示了正確的結果,但不按分數重新排序 – Northumber

+0

對不起,我的錯,我沒有意識到的是,比分被TEXT類型,他是根據ASCII而非編號排序的感謝。幫助:D – Northumber

1

假設用戶|比分是獨一無二的..:

SELECT x.* 
    FROM table_1 x 
    JOIN (SELECT user, MAX(score) score FROM table_1 GROUP BY user) y 
    ON y.user = x.user 
    AND y.score = x.score 
ORDER BY x.score 
+0

另外這個不是重新排序的得分結果:( – Northumber

+0

你是什麼意思?當然有!?! – Strawberry

+0

對不起,我的錯,我沒有意識到的是,比分被TEXT類型,他是根據ASCII而不是數字排序感謝您的幫助:d – Northumber

0

無需編寫子查詢。 簡單的,你可以用這樣的方式:

SELECT id, `user`, MAX(score) FROM table_1 GROUP BY `user` 
ORDER BY MAX(score); 

如果你想與子查詢的查詢:

SELECT * FROM (SELECT id, `user`, MAX(score) as max_score FROM table_1 
GROUP BY `user`) AS sub ORDER BY max_score; 
+0

第一個查詢:是的,這是編寫原始查詢的一種更簡單的方法。但是,返回的ID可能與最高分完全無關的問題仍然存在。第二個查詢:子查詢的結果中沒有'score';你將不得不給'max(分數)'一個別名。 –

+0

@ThorstenKettner:謝謝 –

+0

不客氣。然而,你的回答對OP來說無足輕重。您已經展示瞭如何正確編寫ORDER BY語句,這很好,但是您的查詢仍然沒有解決OP顯然不知道的錯誤ID的問題。 –