質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

12416閲覧

order byしてからgroup byしたい場合

happy_tera

総合スコア159

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/05/18 09:35

編集2017/05/18 09:37

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

workaholist

2017/05/19 06:49

どういうレコードが存在して、取得結果がどういうものになれば良い、という例を書いてもらうのが早いのでは無いでしょうか。
guest

回答3

0

もとのSQLの意図がわかりません

本来、GROUP BYをかけた場合は、以下のものしかSELECTできません。

  • GROUP BYした列
  • MAXMINSUMなどの集計関数
  • 1のようなリテラル
  • 上3つから計算した式

MySQLの場合は、これら以外の列を取得することもできますが、それはどれか適当な行の値になってしまいます。

GROUP BYなのにSELECT *ということはまさしくこのパターンなので、「どれか適当な行でいい」というのでなければ、各グループについて何を取得するのか、明確に定義が必要です。

投稿2017/05/18 09:43

編集2017/05/18 09:51
maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2017/05/18 09:49

横から失礼します。 「ORDER BYをかけた場合」 「ORDER BYした列」 は、 「GROUP BYをかけた場合」 「GROUP BYした列」 ではありませんか?
maisumakun

2017/05/18 09:50

ありがとうございます。単純ミスなので修正します。
happy_tera

2017/05/19 06:40

回答ありがとうございます。 そもそもgroup byを使うことが間違っていたのかもしれません。 b.user_idを最新のものだけひとつだけ取得したかったのです。
guest

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
yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

happy_tera

2017/05/19 06:42

t_user.idはユニークでこれがb.user_idになります。 b.user_idはたくさんあるので最新のものだけをひとつだけ取得したかったのですが、group byを使うことが適切ではなかったのかもしれません。
yambejp

2017/05/19 07:29

なるほど、最新とはなにという別の課題がでてきます。 レコードに更新日時をとっておいて最新日時をとるか auto_incrementなどでそのidの中で最大値をとっているものを とるかですかね
happy_tera

2017/05/19 08:10

ご返信ありがとうございます。 created_atというカラムがあるので作成日時がここに記録されます。 idはauto_incrementなので最大値が新しいものということにもなります。
yambejp

2017/05/19 08:38

sampleつけときます。 t_statusのidの最大値を優先しておきました
happy_tera

2017/05/19 10:20

できました!素晴らしいです! レコード数が億単位になった時はselect二回分の負荷が掛かって大変ですかね。 ありがとうございました!
guest

0

t_usert_statusJOINして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

tkanda

総合スコア2425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

happy_tera

2017/05/19 06:38

回答ありがとうございます。 b.user_id は作成日が最新のものだけをひとつだけ取得したいのです。 私のコードではb.user_idが一番古いものが取得されます。 group byを省いてしまうと複数が取得されてしまいますが、ひとつだけを取得したいのです。 そのためgroup byを使ってひとつにしようと考えました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問