0

2人が同じ詳細を持っている場合、同じランクを取得するという条件を維持するように、複数の列に関して行を並べ替える方法。説明のために例を示します。ここでは、最初にスコアによって順序付けが行われ、ペナルティ付きの同点の場合でも、同点が存在する場合は両方に同じランクが与えられ、次の人が調整されたランクを取得します。

###################
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で不可能な場合、他の選択肢は何ですか??

4

2 に答える 2

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:=@rownum2, @rownum) AS rank, 
@prev:=CONCAT(sq.score, '_', sq.penalty), 
@rownum2:=@rownum2 + 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;

読み取り元のテーブルを更新できないため、ここで一時テーブルを操作する必要があります。セッションが終了すると、一時テーブルは自動的に削除されます。

于 2012-06-29T14:26:23.073 に答える
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)
于 2012-06-29T14:25:04.650 に答える