2016-10-30 9 views
0
SELECT * 
FROM (SELECT id, user, MAX(score) FROM table_1 GROUP BY user) AS sub 
ORDER BY 'sub.score' ASC; 

このSQLクエリでは、テーブルごとにユーザーごとのスコアと精度の高いものを選択する必要があります。GROUP BYの後のORDER BYは有効ではありません

テーブル構造はこれです:

+-----------------------+ 
| id | score | username | 
+-----------------------+ 
| 1 | 15 |  mike | 
| 2 | 23 |  tom | 
| 3 | 16 |  mike | 
| 4 | 22 |  jack | 

etc.. 

結果は以下のようにする必要があります:

3 mike 16 
2 tom 23 
4 jack 22 

そして並べ替え:

3 mike 16 
4 jack 22 
2 tom 23 

しかし、クエリがでサブクエリの順序を変更しません。スコア。それを行う方法?ユーザーを想定し

+0

私はStackOverflowのにこれを移行するために投票した:あなたは、サブクエリでクエリを実行したい場合は

SELECT id, 'user', MAX(score) FROM table_1 GROUP BY 'user' ORDER BY MAX(score); 

: は、単にあなたがこの方法を使用することができます。この質問を削除またはクロスポストするべきではありませんStackoverflow。 –

+1

これは任意のIDを返します – Strawberry

+0

あなたはサブテーブルに**スコア**を持っていないと思います。なぜなら、最大(スコア)エイリアスを与えないからです。 –

答えて

2

はあなたが段階的にやっていることを見てみましょう:

ここ
SELECT id, user, MAX(score) FROM table_1 GROUP BY user 

あなたが1を得るので、あなたが、ユーザー名でグループ化されていますユーザー名ごとの結果行この結果行では、ユーザー名、このユーザー名(「mike」の場合は16)、ユーザー名のID(「mike」の場合は1または3)、 DBMSは自由に選択できます)。これはおそらくあなたが望むものではありません。

SELECT * FROM (...) AS sub ORDER BY 'sub.score' ASC; 

'sub.score'は文字列(一重引用符)です。代わりにサブクエリから最大得点で注文したいと考えています。まず、max(score)に名前を付けます。 max(score) as max_scoreにアクセスし、それにアクセスしてください:ORDER BY sub.max_score ASC

とにかく、ユーザーIDのスコアが最大になるように(同じIDを取得するように)、同じユーザー名とそれ以上のレコードが存在しないレコードを探すことができますスコア。並べ替えは簡単です。集計がないため、スコアで並べ替えるだけです。

select * from table_1 t1 where not exists 
    (select * from table_1 higher where higher.name = t1.name and higher.score > t1.score) 
order by score; 
+0

これは正しい結果を示していますが、スコア順に並び替えることはありません – Northumber

+0

申し訳ありませんが、私のせいで、スコアがTEXTタイプであることに気付かず、数字ではなくASCIIにしたがって注文されました。ヘルプ:D – Northumber

1

|スコアはユニークです..:

SELECT x.* 
    FROM table_1 x 
    JOIN (SELECT user, MAX(score) score FROM table_1 GROUP BY user) y 
    ON y.user = x.user 
    AND y.score = x.score 
ORDER BY x.score 
+0

また、これはスコアで結果を並べ替えません: – Northumber

+0

どういう意味ですか?! – Strawberry

+0

申し訳ありませんが、私のせいで、スコアがTEXTタイプであることに気付かず、お返事ありがとうございました:D – Northumber

0

サブクエリーを書く必要はありません。

SELECT * FROM (SELECT id, `user`, MAX(score) as max_score FROM table_1 
GROUP BY `user`) AS sub ORDER BY max_score; 
+0

最初のクエリ:はい、元のクエリを書き込むための簡単な方法です。しかし、返されたIDが最大スコアとまったく無関係であるという問題は依然として存在します。 2番目のクエリ:サブクエリの結果には「スコア」はありません。 'max(score)'にエイリアス名を与える必要があります。 –

+0

@ThorstenKettner:ありがとうございます –

+0

ようこそ。しかし、あなたの答えはOPをそれほど助けません。 'ORDER BY'節を正しく書く方法を示しましたが、これはうまくいきますが、あなたの質問はOPが明らかに認識していない間違ったIDの問題に対処していません。 –