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

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

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

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

Q&A

解決済

2回答

5599閲覧

テーブル結合でGROUP_CONCATを使用する際、SELECTカラムに応じて他のカラムの結果が変わるのはなぜ?

re97

総合スコア208

MySQL

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

0グッド

0クリップ

投稿2016/02/29 05:44

編集2016/02/29 10:31

前提

テーブルatable
・idカラム
・titleカラム

テーブルbtable
・b_idカラム
・b_titleカラム

テーブル関係
・1つのatableに対して複数btable


最終的にやりたいこと

atableのidカラム毎に以下の内容を取得したい
・1つのatable1レコードに対して、btableのレコードが2つあった場合
(
[id] => 1
[title] => atableのレコード1内容
[b_title] => btableのレコード9内容,btableのレコード23内容


期待した結果を取得できたSQL

SQL

1SELECT 2 a.id, 3 r.b_id, 4 GROUP_CONCAT(b_title) AS b_title 5FROM atable AS a 6LEFT OUTER JOIN( 7 SELECT 8 b_id,b_title 9 FROM 10 btable 11) AS r ON a.id = r.b_id 12 13GROUP BY a.id

期待した結果を取得できないSQL1
・SELECT で、r.b_idを外すと、a.idの結果がおかしくなる(上記と比較すると、a.idの取得値が変更される。何の値かは不明)

SQL

1SELECT 2 a.id, 3 GROUP_CONCAT(b_title) AS b_title 4FROM atable AS a 5LEFT OUTER JOIN( 6 SELECT 7 b_id,b_title 8 FROM 9 btable 10) AS r ON a.id = r.b_id 11 12GROUP BY a.id

期待した結果を取得できないSQL2
・SELECT で、a.idを外すと、r.b_idの結果がおかしくなる(r.b_idの取得値が変更される。何の値かは不明)

SQL

1SELECT 2 r.b_id, 3 GROUP_CONCAT(b_title) AS b_title 4FROM atable AS a 5LEFT OUTER JOIN( 6 SELECT 7 b_id,b_title 8 FROM 9 btable 10) AS r ON a.id = r.b_id 11 12GROUP BY a.id

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

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

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

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

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

dupont_kedama

2016/02/29 08:33

「おかしくなる」というのが具体的にどんなことなのかがわからないです。
guest

回答2

0

ベストアンサー

GROUP_CONCATの使い方がおかしくないですか?
GROUP_CONCAT(カラム名)は、GROUP_BY句でグループ化した行の中から、指定したカラムの値を連結して返す関数です。

投稿2016/02/29 09:11

sonor_3rd

総合スコア114

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

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

re97

2016/02/29 10:32

最終的にやりたいことを満たすためには、具体的にどう記述すれば良いでしょうか?
sonor_3rd

2016/02/29 12:19

スマホなのでヒントだけ。btableにatableをjoinして、a.idをgroup byでまとめてください。これでb_titleが複数行まとまる形になると思うので、concatで連結できるかと。
sonor_3rd

2016/02/29 12:23

あ、btableにはaのidがないのか。失礼しました
sonor_3rd

2016/02/29 12:27

元のテーブルを(select 任意カラム from atable,btable where atable.b_id=btable.id)にしてgroup by a.idとconcatすると幸せになれるかも
sonor_3rd

2016/02/29 23:46

SELECT id, title, GROUP_CONCAT(b_title) FROM (SELECT atable.id AS id, atable.title AS title, btable.b_title AS b_title FROM atable, btable WHERE atable.id = btable.b_id ) GROUP BY id これでいかがでしょうか?
re97

2016/03/01 03:50

>あ、btableにはaのidがないのか。失礼しました ・「b_id」カラムは、「aのid」カラムの値です
sonor_3rd

2016/03/01 03:58 編集

上でだめならこれです。 SELECT a.id AS id, a.title AS title, GROUP_CONCAT(b.b_title) AS b_title FROM btable b LEFT JOIN atable a ON (b.b_id = a.id) GROUP BY a.id
re97

2016/03/02 03:28

おお! いけました! なぜでしょう? ON の後に()が必要だったということでしょうか???
sonor_3rd

2016/03/02 04:57

すみません。知識不足のため原因までは解りませんが、括弧は問題ではないはずです。 テーブル構成をみて、LEFT OUTER JOINが気になりました。 RIGHT OUTER JOINで同様の症状が起きるか、検証していただけますか?
re97

2016/03/03 03:38

・「RIGHT OUTER JOIN」など色々試した結果、ようやく原因が分かりました ・「何の値か不明」と書きましたが、よくよくよくよく調べてみたらそういうレコードがちゃんと存在していました ・全て私の勘違いでした(非常に良く似たデータが複数あり、そのことを全く認識していなかったため) ・最終的に、当初のSQL文でも回答いただいたSQLでも、期待した結果を取得できることを確認できました ・何回も質問してしまいましたが、おかげで勘違いに気がつくことができました ・貴重な数日間、お付き合いいただきありがとうございました
sonor_3rd

2016/03/03 03:53

余談ですが・・・btableをb_idでグルーピングした後でatableと結合する手法もありますね。 問題解決できてなによりです。
guest

0

「おかしくなる」原因がぱっと思いつかないのですのですが、
テーブル結合についてちょっと気になるので提案です。

シンプルに

SQL

1SELECT 2 a.id, 3 GROUP_CONCAT(b_title) AS b_title 4FROM atable AS a 5LEFT JOIN btable AS b ON a.id = b.b_id 6GROUP BY a.id

ではダメでしょうか?

もし質問文に記載されていない(サブクエリでなければならないような)条件があるなら、それも可能な範囲で提示してください。

投稿2016/02/29 14:13

dupont_kedama

総合スコア925

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

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

re97

2016/03/01 03:47

回答ありがとうございます。 ・試してみましたが、結果は変わりませんでした ・SELECT a.id,だとよく分からない値になり ・SELECT a.id,b.b_idだと期待した値を取得できます
dupont_kedama

2016/03/01 05:06

「,GROUP_CONCAT(b_title) AS b_title」 がなければ a.id だけでも期待した値を取得できるのでしょうか?
re97

2016/03/02 03:24

「,GROUP_CONCAT(b_title) AS b_title」を削除すると、 a.id だけで期待した値を取得できます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問