order by よりも group byの方が先に処理されますが、group byする値をdescしたもの取得する場合はどのようにしたらよいのでしょうか?
select * from t_user as A left join t_statas as b on A.id = B.user_id group by b.user_id order by A.id desc";
この場合はb.user_idが昇順で取得されてしまいますが、降順で取得したいです。
宜しくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答3件
0
もとのSQLの意図がわかりません。
本来、GROUP BYをかけた場合は、以下のものしかSELECTできません。
GROUP BYした列MAX、MIN、SUMなどの集計関数1のようなリテラル- 上3つから計算した式
MySQLの場合は、これら以外の列を取得することもできますが、それはどれか適当な行の値になってしまいます。
GROUP BYなのにSELECT *ということはまさしくこのパターンなので、「どれか適当な行でいい」というのでなければ、各グループについて何を取得するのか、明確に定義が必要です。
投稿2017/05/18 09:43
編集2017/05/18 09:51総合スコア147054
2017/05/18 09:49
2017/05/18 09:52
0
ベストアンサー
SQL文自体がまちがっているのはとりあえずおいておくとして
いずれにしてもt_userとt_statasの仕様次第でしょうね
カラム名から想像するにt_user.idはユニークなidのように思えますが
t_statas.user_id はどうなんでしょう?
1対1なら特に集約する必要もないでしょうけど1対nなら
なんらかの工夫が必要になるでしょう。
またt_user.id∋(∈)t_statas.user_idなのかによっても
いまのSQL文で必要十分なのか微妙です
sample
sample付けときます
- 元データ
SQL
1create table t_user (id int not null primary key,uname varchar(30)); 2insert into t_user values(1,'坂本'),(2,'阿部'),(3,'マギー'); 3create table t_status(id int not null primary key,user_id int,sname varchar(30)); 4insert into t_status values(1,1,'ショート'),(2,2,'キャッチャー'),(3,2,'ファースト'),(4,2,'代打'),(5,3,'サード'),(6,3,'代打'); 5
- 検索
SQL
1select * from t_user as A 2left join t_status as B on A.id=B.user_id 3and B.id in(select max(id) from t_status group by user_id); 4
投稿2017/05/19 01:33
編集2017/05/19 08:37総合スコア118425
0
t_userとt_statusをJOINしてselect *した結果をソートするだけなら、単純にgroup by b.user_idは不要ではありませんか?
SQL
1select * from t_user as A left join t_statas as b on A.id = B.user_id order by A.id desc
これで期待通りの結果が得られるのでは?
ご参考になれば。
投稿2017/05/18 14:12
総合スコア2425
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。