2016-10-12 27 views
0

假設我們有一個表:MySQL的選擇最多爲每個USER_ID,也得到一些其他領域

+----+---------+-------+--------+ 
| id | user_id | score | errors | 
+----+---------+-------+--------+ 
| 1 | 123  | 50 | 12  | 
| 2 | 123  | 55 | 7  | 
| 3 | 444  | 90 | 1  | 
| 4 | 555  | 78 | 2  | 
| 5 | 123  | 50 | 0  | 
+----+---------+-------+--------+ 

如何選擇3個用戶提供最高分和錯誤這些MAX成績嗎? 我期待得到ids: 3,4和5

P.S.我使用MySQL only_full_group_by啓用

更新:我必須得到最高分的每個用戶,並精確字段錯誤(這是關係到MAX比分該用戶)

答: 這可能是簡單的使用以下查詢完成。但是,如果一個用戶有兩個相同的MAX分數(例如用戶123有2個記錄,分數= 50),則會爲該用戶返回2條記錄。在這裏,我們可以(使用PHP或一些其他語言,如指數USER_ID)

SELECT t1.user_id, max_score, errors 
FROM tbl t1 JOIN (
    SELECT max(score) AS max_score, user_id 
    FROM tbl 
    GROUP BY user_id 
) t2 ON t1.user_id = t2.user_id AND t1.score = t2.max_score; 
+0

的可能的複製[MYSQL GROUP BY MAX得分](HTTP選擇的行。 com/q/23192153/3340665) – GhostGambler

+0

得分與MAX得分相同嗎?或者用戶在表格中有兩行,分數不同?桌子的主要關鍵是什麼? – Julian

+0

我想要前三名的成績,我希望你能得到id 3,4和** 2 **。 –

回答

0

只留下最後一條記錄這應該工作:

select MAX(score) from table_name limit 3; 
1

拿到3,4,5,你不」 t需要聚合功能和排序。

使用order bylimit

select id, user_id, score, errors 
from my_table 

order by score desc, errors desc limit 3 
0

排序按降序排列,並得到前3個記錄:

Select id, user_id,score, errors FROM [Table_Name] order by score desc, 
errors asc limit 3 
1

這只是另一個角度。首先根據他們的得分降序排列每個user_id的排名/行號。 //計算器:然後,我們可以用具有秩/ ROW_NUMBER值1

查詢

SELECT t.id, t.user_id, t.score, t.errors FROM(
    SELECT id, user_id, score, errors, 
    (
     CASE user_id WHEN @curA 
     THEN @curRow := @curRow + 1 
     ELSE @curRow := 1 AND @curA := user_id END 
    ) AS rn 
    FROM tblScore t, 
    (SELECT @curRow := 0, @curA := '') r 
    ORDER BY user_id, score DESC 
)t 
WHERE t.rn = 1 
ORDER BY t.score DESC; 

SQL Fiddle Demo

+0

此查詢正常工作。我還提供了一些其他方式來解決我的問題 – AlexWasHere