2016-11-02 8 views
1

私はクエリを作成しようとしていますが、私は既にstackofで答えを探しましたが、私のニーズに合ったものは見つかりませんでした。 私は "nickname"と "score"の2つの列があるplayerという名前のテーブルを持っています。 は私がトップ5選手取得するには、このクエリを使用します。特定のプレーヤーSQLクエリのランクを選択

SELECT nickname, score 
FROM player 
ORDER BY score DESC LIMIT 5; 

を、私は答えとしてこれを得た:、私はシングルプレイヤーのランクを持っているしたいのですが今

nickname - score:  
zod  - 30 
ciao  - 20 
jiji  - 20 
mayina - 20  
jon  - 0. 

、してみましょうリスト内の3番目の結果であるため、「jiji」と言い、結果として3を得る。

私は

SELECT COUNT(*) AS rank 
FROM player 
WHERE score >= (SELECT score FROM player WHERE nickname = 'jiji') 

のような多くのクエリを試してみましたが、彼らは常にそのテーブルにスコアとして20を取得し、最後のプレイヤーのランクである「ジジ」または「CIAO」、4を返します。

どうやって「ジジ」を3つにすることができますか?どうもありがとうございました。これは、スコアタイの場合には安定しないことに関する

SET @rank=0; 
SELECT * 
FROM (SELECT @rank:[email protected]+1, nickname, score 
    FROM player 
    ORDER BY score 
    DESC) AS t 
WHERE t.nickname = 'jiji'; 

正しいコメント:

+0

です。質問にタグを付けるときは注意してください。これは明らかにmysqlであり、sql-serverではありません。これらは同じものではありません。 –

+0

あなたはUR問題を解決するために解析関数を使う必要があります – Teja

+0

ここを見てください:http://stackoverflow.com/questions/2520357/mysql-get-row-number-on-select – Galz

答えて

1

を、jijiためランクは次のようになります。

SELECT count(*) + 1 AS rank 
FROM player 
WHERE score > (SELECT score FROM player WHERE nickname = 'jiji'); 

これは "を返しますスコア= 30のときに繋がりがあるので、「2」になります。

ランクを安定させ、各行ごとに異なるようにするには、追加のキーが必要です。明白なキー(この場合)はnickname

SELECT count(*) AS rank 
FROM player p CROSS JOIN 
    (SELECT score FROM player WHERE nickname = 'jiji') s 
WHERE p.score > s.score or 
     (p.score = s.score and p.nickname <= 'jiji'); 
+0

これは実際に(ありがとう)私がやろうとしたものであるが、私はちょうどphpmyadminのはキーのアルファベット順ごとも注文していないことに気づいた(ニックネーム私が最初にクエリを実行するとき、私はこの 'SELECTニックネームを取得できます)。 ..だから、ニックネームアルファベット順によっても順番に?私が働いていた何もなく、何かをしようとしたスコアDESC限界によってプレイヤー ORDER FROM 5'クエリを スコア。 (私はこれを乗り越えようとしているので、時間があったので少し混乱している、残念..) –

3

はこれを試してみてください。それを安定させるために、我々はその後、スコアに基づいてされるようにソートし、ニックネーム変更することができます。一般的に使用される定義を使用

SELECT * 
FROM (SELECT @rank:[email protected]+1, nickname, score 
    FROM player 
    ORDER BY score, nickname 
    DESC) AS t 
WHERE t.nickname = 'jiji'; 
+0

私はちょうどここでもう一度チェックする前に同じクエリを思いつきました(ありがとう!) 今は私がこれをPHPで使っているので、私は 'セット@ランク= 0'と残りの残りのための他の。 2番目のクエリでこれを実行しようとすると、 "エラーが発生しました。"フィールドリストの "ランク"が不一致です –

+0

私が使用しているコード: '$ querysetRank =" @rank = 0 "; { $ queryPlayerRank = "ランクをSELECTランク(ランクとしてランク:ランクとして=ランク+1、ランクとしてランク付けする、スコア降順でニックネームFROMプレイヤーオーダー)をplとして指定します。ここで、pl.nickname($ result = mysqli_query $ database、$ querysetRank) = '$ nickname' "; もし(@ resultZ = mysqli_query($ database、$ queryPlayerRank))) else // do things' –

+0

@JulsA私は両方のクエリを実行する必要があると思う同じセッションから、 '@ rank'が2番目のクエリで利用可能になります。 – Galz

関連する問題