2015-03-02 39 views
1

在一個表中的列值,就像在下面的例子中,MySQL的重新排序/重新排序排的位置,如果發生過一次

+--------+-------------------+-----------+ 
| ID  | Name    | Score | 
+--------+-------------------+-----------+ 
| 1  | John    | 80  | 
| 2  | John    | 75  | 
| 3  | Daniel   | 70  | 
| 4  | Lisa    | 60  | 
| 5  | Joe    | 74  | 
+--------+-------------------+-----------+ 

我想選擇的名字和他們定位爲按他們的成績,但仍然要確保如果同一個名字出現兩次,那麼可以將它壓下來(這樣在上面的例子中,約翰並不是兩次出現在對方之後)。例如,當我檢索它時,它應該以格式如下:

+--------+-------------------+-----------+ 
| ID  | Name    | Score | 
+--------+-------------------+-----------+ 
| 1  | John    | 80  | 
| 2  | Joe    | 74  | 
| 3  | Daniel   | 70  | 
| 4  | Lisa    | 60  | 
| 5  | John    | 75  | 
+--------+-------------------+-----------+ 

如果這樣的查詢是可能的,那麼我們甚至可以控制低於行被推?

回答

2

試試這個:

SELECT @RN := @RN + 1 AS ID,Name,Score FROM 
(SELECT T1.Name, T1.Score, count(*) as RN1 
FROM TableName T1 
JOIN TableName T2 ON T1.Name = T2.Name AND T1.Score <= T2.Score 
GROUP BY T1.Name, T1.Score) TempTable,(SELECT @RN := 0) R 
ORDER BY RN1, Score DESC 

結果:SQL Fiddle

ID NAME SCORE 
1 John 80 
2 Joe  74 
3 Daniel 70 
4 Lisa 60 
5 John 75 

示例結果。

說明:

如果執行內部查詢,你會得到通過分數降序排列的記錄與列RN1爲2約翰和1人相處。它基本上是一個排名系統。然後我們將根據RN1列的結果進行排序。所以你會得到結果的名稱和分數。

外部查詢用於添加ID列(實際上是一個行號列)。

1

我的傾向是聚合數據並計算每個名稱的行數和最大分數。因爲是你的實際數據也是如此 - 如果有上最大比分沒有重複

select t.* 
from table t join 
    (select name, max(score) as maxs, count(*) as cnt 
     from table t 
     group by name 
    ) tt 
    on t.name = tt.name 
order by (case when t.score = t.maxscore then 1 else 2 end), 
     score desc; 

這應該工作:然後利用這些信息爲order by。解決這個問題的方法之一是使用替代ID:

select t.id, t.name, t.score 
from (select t.*, 
      (select t2.id 
       from table tt 
       where tt.name = t.name 
       order by score desc 
       limit 1 
      ) as maxscore_id 
     from table t 
    ) t 
order by (id = maxscore_id) desc, score desc;