2012-06-29 20 views
0

如何對多列進行排序,使排序保持條件:如果兩個人具有相同的詳細信息,則它們的排名相同。我將舉一個例子來說明:在這裏,首先排序是通過分數來完成的,如果與罰分並列,那麼如果同時存在排名,則下一個人獲得排名。如何在mysql中對多列進行排序

################### 
rank roll score penalty 
1 11 3  23 
2 12 3  20 
2 13 3  20 
2 14 3  20 
5 15 2  10 

所以問題是如何填充列的列?如果不可能在MySQL中是什麼其他的替代?

回答

1

測試數據:

/* 
drop table test; 
create table test (roll int, score int, penalty int); 
insert into test (roll, score, penalty) values (11, 3, 23), (12, 3, 20), (13, 3, 20), (14,3,20), (15, 2, 10); 
*/ 

這裏說到:

ALTER TABLE test ADD COLUMN `rank` int FIRST; 
CREATE TEMPORARY TABLE tmp_test LIKE test; 
INSERT INTO tmp_test (`rank`, roll, score, penalty) 
SELECT cast(q.`rank` as unsigned integer) as `rank`, roll, score, penalty FROM (
SELECT IF(@prev != CONCAT(sq.score, '_', sq.penalty), @rownum:[email protected], @rownum) AS rank, 
@prev:=CONCAT(sq.score, '_', sq.penalty), 
@rownum2:[email protected] + 1, 
sq.* 
FROM (
    SELECT 
    roll, score, penalty 
    FROM 
    test 
    , (SELECT @rownum:=0, @prev:='', @rownum2:=1) r 
    ORDER BY score DESC, penalty DESC 
) sq 
) q; 

UPDATE test t INNER JOIN tmp_test tt ON t.roll = tt.roll AND t.score = tt.score AND t.penalty = tt.penalty 
SET t.rank = tt.rank; 
/*optionally...*/  
DROP TABLE tmp_test; 

這裏您需要使用臨時表的工作,因爲你可以」 t更新你正在閱讀的表格。會話結束後,臨時表將自動刪除。

+0

它沒有給出第五等級將推出15 ..它給第三等級 –

+0

@HarshKhandelwal對不起,現在糾正它,並進行測試。對我來說工作得很好。 – fancyPants

+0

你是怎麼測試的? ?對我來說,排名列顯示BLOB數據..我想要的是在這些查詢後,排名列必須具有所描述的排名 –

0

試試這個:

SET @row = 0; 
select min(a.Row) as Rank, s.Roll, s.Score, s.Penalty 
from (
    select @row := @row + 1 AS Row, 
     Roll, 
     Score, 
     Penalty 
    from Score 
    order by Score desc, Penalty desc 
) a 
inner join Score s on a.Score = s.Score and a.Penalty = s.Penalty 
group by Roll, Score, Penalty 
order by min(Row) 
+0

我遺漏了我的「GROUP BY」子句,現在已更新。 – RedFilter

+0

它不工作....它給不同的等級,以相同的分數和懲罰..以及如何使等級的更新??當我刷新(PHPMYadmin的)頁面時,我得到相同的空值爲排列欄 –

+0

對不起,沒有MySQL服務器進行測試,似乎SQL小提琴不能處理代碼。 @Jake Feasel – RedFilter