teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

Q&A

解決済

3回答

14761閲覧

mysqlで内部結合をし、order byとgroup byを併用する時の書き方が知りたいです。

hiroppii

総合スコア38

MySQL

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

0グッド

0クリップ

投稿2016/07/29 12:55

編集2016/07/29 16:08

0

0

###前提・実現したいこと
mysqlで内部結合をし、order byとgroup byを併用する時の書き方が知りたいです。

テーブルは、「chat」「chat_messa」と言うテーブルを作りました。
「chat」の「id」と「chat_messa」の 「chat_id」で結合しました。

chatテーブルのデータ
+----+-------------+
| id | messa |
+----+-------------+
| 1 | こんにちは |
| 2 | こんばんは |
| 3 | さようなら |
+----+-------------+

chat_messaテーブルのデータ
+---------+-------------------------+
| chat_id | updated_date |
+---------+-------------------------+
| 1 | 2016-07-24 11:44:27 |
| 1 | 2016-07-24 19:42:42 |
| 2 | 2016-07-25 10:27:37 |
| 2 | 2016-07-29 13:45:59 |
| 3 | 2016-07-27 00:13:33 |
| 3 | 2016-07-29 08:13:13 |
+---------+-------------------------+

結合後のデータでは、下記のように取得したいのですが、
+----+-------------+---------+-------------------------+
| id | messa | chat_id | updated_date |
+----+-------------+---------+-------------------------+
| 3 | さようなら | 3 | 2016-07-29 08:13:13 |
| 2 | こんばんは | 2 | 2016-07-29 13:45:59 |
| 1 | こんにちは | 1 | 2016-07-24 19:42:42 |
+----+-------------+---------+-------------------------+

order byとgroup byを併用すると、下記のようになってしまします。
+----+-------------+---------+-------------------------+
| id | messa | chat_id | updated_date |
+----+-------------+---------+-------------------------+
| 3 | さようなら | 3 | 2016-07-27 00:13:33 |
| 2 | こんばんは | 2 | 2016-07-25 10:27:37 |
| 1 | こんにちは | 1 | 2016-07-24 11:44:27 |
+----+-------------+---------+-------------------------+

###発生している問題

order byとgroup byを併用する時には、サブクエリを使えば良いのはわかったのですが、テーブルの内部結合をした場合にはどう書いたらいいのかわからずに困っています。

###該当のソースコード

mysql

1テーブルの内部結合なしなら、これで出来ました。 2select * from (select * from chat_messa order by updated_date desc) as subquery group by chat_id order by id desc 3 4テーブルの内部結合をした場合が分かりません。 5

###試したこと
テーブルの内部結合なしなら、これで出来ました。
select * from (select * from chat_messa order by updated_date desc) as subquery group by chat_id order by id desc

###補足情報(言語/FW/ツール等のバージョンなど)
mysql5.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答3

0

ベストアンサー

結合後のテーブルから推測しますと
<仕様>
chat_messaテーブルに有る最新日付のchat_idを抽出して、chatテーブルの文言を合わせてchar_idの大きい順に表示します。

sql

1 2select t2.id, t2.messa, t1.chat_id, t1.update_date from 3 (select chat_id, max(udate_date) update_date from chat_messa group by chat_id) t1 4 join chat t2 on t1.chat_id=t2.id 5 order by 1 desc;

投稿2016/07/29 18:43

A.Ichi

総合スコア4070

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

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

hiroppii

2016/07/29 20:36 編集

回答有難う御座います。 A.Ichi さんの SQLを実行させて頂いたところ、updated_date が新しいもので取得出来ました。 ありがとうございました。
guest

0

sql

1SELECT id, messa, chat_id, updated_date FROM chat 2INNER JOIN chat_messa ON chat.id = chat_messa.chat_id 3ORDER BY id DESC

テーブルの関係が、1:1 なのか、1:n なのか不明だし、提示された例だと group にする意味も不明なので、これ以上説明不可。

sql

1SELECT id, messa, chat_id, max(updated_date) as updated_date FROM chat 2LEFT JOIN chat_messa ON chat.id = chat_messa.chat_id 3GROUP BY chat_messa.chat_id 4ORDER BY chat.id DESC

投稿2016/07/29 14:01

編集2016/07/29 14:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hiroppii

2016/07/29 14:38 編集

回答有難う御座います。 テーブルの関係が、1:1です。 chat_messaテーブルには、複数のchat_idが格納されているので、groupで、一つにまとめる必要があります。 また、テーブルの様子を書き加えました。
退会済みユーザー

退会済みユーザー

2016/07/29 14:39

> chat_messaテーブルには、複数のchat_idが格納されているので、groupで、一つにまとめる必要があります。 それなら 1:n では?
hiroppii

2016/07/29 14:41

すみません。勘違いしていました。 1:nです。
退会済みユーザー

退会済みユーザー

2016/07/29 14:43

あと、複数あるなら、updated_date をどのようなルールで取り出すのか不明。最小値なのか、最大値なのか。
hiroppii

2016/07/29 14:59

updated_date のなかでより新しいものを取得したいので、最大値になるかと思います。
退会済みユーザー

退会済みユーザー

2016/07/29 15:00

回答に追記しておきました
hiroppii

2016/07/29 15:19

ありがとうございます。 回答の通り実行させて頂いたのですが、updated_dateの部分が古いものが出て来てしまいます。
退会済みユーザー

退会済みユーザー

2016/07/29 15:22

updated_date の型が適切ではないのでは?おおかた、varchar で設定でもしているのでは?
hiroppii

2016/07/29 15:48

updated_date の 型は、datetime になっていました。
退会済みユーザー

退会済みユーザー

2016/07/29 15:49

datetime なのに、2016-07-29 とデータが入っていることに矛盾します。正確な情報を提供してください。
hiroppii

2016/07/29 16:10

データの情報を変更させて頂きました。
退会済みユーザー

退会済みユーザー

2016/07/29 16:12

だとしても、先の回答で問題ないはずですよ。それでも最大値が取れないんでしたら、他の問題かと思います。
hiroppii

2016/07/29 16:34

わかりました。 有難う御座います。 いつも有難う御座います。
guest

0

おそらく今回のケースはサブクエリでつなぐのではないと思います
またサブクエリの中でorder byしていますが意味がわかりません

group byするときはselect句が*はありえないので
きちんと集計キーと集計方法を記載してください

追記

例示のデータを利用するとこうかな?

SQL

1select * from chat inner join 2(select chat_id,max(updated_date) as updated_date from chat_messa group by chat_id) as sub 3on chat.id=sub.chat_id order by id desc;

投稿2016/07/29 12:58

編集2016/07/29 14:52
yambejp

総合スコア117830

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

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

hiroppii

2016/07/29 14:38 編集

回答有難う御座います。 内部結合をした後に、updated_dateカラムの降順で取得したいと思っています。 また、データベースの構造を書き足しました。
yambejp

2016/07/29 14:53

追記しときました
hiroppii

2016/07/29 15:33

ありがとうございます。 実行させて頂いたのですが、updated_dateの部分が古いものが出て来てしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問