
MySQLで、「GROUP_CONCAT」を「複数列」に適用させ、それぞれ異なるレコードを1つにまとめようとしたのですが、
取得出来る結果が、多い方の数に引き連られてしまいます。
ざっくりとした質問でアレなのですが、これは結合の仕方が悪い、
と推測されるでしょうか?
そもそも「GROUP_CONCAT」を複数列に適用させる場合、それぞれ異なるレコード数をまとまることはできるのでしょうか?。
■期待した取得結果
[テーブルAカラムc] => tokyo,osaka
[テーブルAカラムd] => japan,japan
[テーブルBカラムe] => windows
[テーブルBカラムf] => man
■実際の取得結果
[テーブルAカラムc] => tokyo,osaka
[テーブルAカラムd] => japan,japan
[テーブルBカラムe] => windows,windows
[テーブルBカラムf] => man,man
「テーブルB」の取得結果が、「テーブルA」取得結果数に引き連られてしまいます
■SQL(抜粋)
SELECT
GROUP_CONCAT(a.c) AS c,
GROUP_CONCAT(a.d) AS d,
GROUP_CONCAT(b.e) AS e,
GROUP_CONCAT(b.f) AS f
FROM hoge h
LEFT JOIN テーブルA a ON (h.id = a.hoge_id)
LEFT JOIN テーブルB b ON (h.id = b.hoge_id)
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
なんか説明がデータベーステーブルの行と列の考え方が90°狂っているとしか思えないんだが。
id と他カラムとの関係が見えない。group by がないんだけど、 tableごとに全行 group_concat したいだけですか?もしそうならjoin の順番を間違えてますね。
a テーブルからは、h テーブルにも同じid値が存在する行を選択して 全行に group_concat
b テーブルも同様
で各一行づつになったサブクエリをjoin であれば、以下
select * from
( select group_concat(c) as c, group_concat(d) as d from a where exists ( select * from h where a.id=h.id ) ) as a1
closs join
( select group_concat(e) as e, group_concat(f) as f from b where exists ( select * from h where b.id=h.id ) ) as b1 ;
No.1
- 回答日時:
「MySQL では、式のコンビネーションの連結された値を得ることができます。
DISTINCT を使用することで、重複した値を除くことが可能です。結果の値をソートしたい場合は、ORDER BY 句を使用してください。」と以下にあります。
http://dev.mysql.com/doc/refman/5.1/ja/group-by- …
GROUP_CONCAT(distinct b.e) AS e,
・・・
にしてみるとうまくいきませんか?
なお、そもそもの考え方として、
>MySQLで、「GROUP_CONCAT」を「複数列」に適用させ、それぞれ異なるレコードを1つにまとめようとしたのですが、
とかかれておりますが、
>FROM hoge h
>LEFT JOIN テーブルA a ON (h.id = a.hoge_id)
>LEFT JOIN テーブルB b ON (h.id = b.hoge_id)
こう書いている時点で、
tokyo,japan,windows,man
osaka,japan,windows,man
の2レコードがあるテーブルに対する処理になりますので、
「異なるレコード」という表現はおかしいです。
「異なる集計条件(同一値は1つしか表示しない)」なら問題ないと思いますが。
なお、すべての項目にdistinctを書くと
>■期待した取得結果
とはならずに、以下となります。
[テーブルAカラムc] => tokyo,osaka
[テーブルAカラムd] => japan
[テーブルBカラムe] => windows
[テーブルBカラムf] => man
ちなみにどういうことをしたいのかがいまいち見えていないのですが。
例えば、
[テーブルAカラムc] => tokyo,osaka,New York,New York,London
[テーブルAカラムd] => japan,japan,USA,USA,GB
[テーブルBカラムe] => windows,windows,unix,linux,windows
[テーブルBカラムf] => man,man,woman,woman,man
(distinctなしのイメージ=質問文のSQL
:順番指定なしのためこういう順序ででるかどうかはわかりませんが、
まあ各項目が対応している形でたまたまでてくれたということで。)
というときにはどう出したいのでしょう?
[テーブルAカラムc] => tokyo,osaka,New York,London
[テーブルAカラムd] => japan,USA,GB
[テーブルBカラムe] => windows,unix,linux
[テーブルBカラムf] => man,woman
ですか(distinct付きのイメージ)
LondonはlinuxでWomanに見えてしまいそうですが。
(正しくはwindowsでManです。)
この回答への補足
回答ありがとうございます。
やりたいのは以下のような感じです。
■前提
[テーブルAカラムc] => 「tokyo」「osaka」「New York」「New York」「London」
[テーブルAカラムd] => 「japan」「japan」「USA」「USA」「GB」
[テーブルBカラムe] => 「windows」「windows」「unix」「linux」「windows」
[テーブルBカラムf] => 「man」「man」「woman」「woman」「man」
この時、テーブルHがあって、
■テーブルHのidカラムとテーブルAのidカラムが一致したら、「GROUP_CONCAT」で「,」結合取得
[テーブルAカラムc] => tokyo,osaka,New York,New York,London
[テーブルAカラムd] => japan,japan,USA,USA,GB
※5つ一致した場合、5つを,で連結して取得
■テーブルHのidカラムとテーブルBのidカラムが一致したら、「GROUP_CONCAT」で「,」結合取得
[テーブルBカラムe] => windows,windows,unix,linux
[テーブルBカラムf] => man,man,woman,woman
※4つ一致した場合、4つを,で連結して取得
だけど、実際に取得してみたら、両方とも5つで取得されてしまう
なんででしょうか? という内容です。
distinctで重複削除したいわけではなくて、別カラムと一致した場合、それぞれの結合条件を満たすレコードを、すべて「,」で連結して抜き出したいけど、その結合条件を、2つのテーブルに対して行うと、おかしな感じになってしまいます。GROUP_CONCATというより、結合の仕方に問題がある(と推測される)のでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle SQL update方法 2 2022/06/22 14:07
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Oracle sqlで質問です。 idを元にidに紐付くデータで住所コードがjpのみのデータ以外のidを取得したい 4 2023/03/20 17:41
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- PostgreSQL 列が存在しないと言われる 2 2023/02/10 18:33
- Oracle sql(oracle)で質問です。 テーブルAのカラム名、日付(yyyymmdd)の値を テーブルB 2 2023/01/06 10:31
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「テーブルに座って……」という...
-
会社の飲み会の幹事になり、座...
-
取数計算
-
L2SWはARPテーブルを持っている?
-
外部キーだけのテーブル(主キ...
-
特定物と不代替物の違い
-
テーブルリンク リンク元を知...
-
【エクセル】データテーブルの...
-
複雑なSQL文について
-
1対1のリレーション(主キー同...
-
下記、問題に対しての解答が以...
-
飲み会で、座敷orテーブルどち...
-
アクセスのリンクテーブル一覧...
-
【MySQL】1対1でテーブルをあ...
-
論理名とコメント構文(?)について
-
複数テーブルにわたるCOUNT
-
お金持ちのテーブル
-
ACCESS VBA でテーブルの定義だ...
-
オーダーの覚え方について
-
複数のテーブルの レコード件数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
会社の飲み会の幹事になり、座...
-
「テーブルに座って……」という...
-
面接のときテーブルが正面に。...
-
L2SWはARPテーブルを持っている?
-
テーブルリンク リンク元を知...
-
飲み会で、座敷orテーブルどち...
-
外部キーだけのテーブル(主キ...
-
男性と2人で飲食店に行きテーブ...
-
論理名とコメント構文(?)について
-
【エクセル】データテーブルの...
-
オーダーの覚え方について
-
まるいテーブル 円い 丸い 漢字...
-
リレーションシップが出来ません。
-
アクセスのリンクテーブル一覧...
-
UTF8のテーブルをODBCドライバ...
-
1対1のリレーション(主キー同...
-
データベースの接続に失敗して...
-
mysqlのupdate構文についての質...
-
妹が、メルカリで売れた商品を...
-
ACCESS での LEFT JOIN 時の WH...
おすすめ情報