• ベストアンサー
  • 困ってます

mysqlのSQL文の書き方についてご質問いたします。

  • 質問No.5294003
  • 閲覧数81
  • ありがとう数7
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 100% (3/3)

下記のようなテーブルがあるとします。

[table_a]

type,name1,name2
----------------
1,sato,keiko
2,ito,yoko
2,kishi,hruna
3,yasuda,fumi


上記テーブルに対して下のSQL文を発行すると

SELECT type, CONCAT( name1,name2 )
FROM table_a

実行結果

type,CONCAT( name1,'-',name2 )
------------------------------
1,sato-keiko
2,ito-yoko
2,kishi-hruna
3,yasuda-fumi

上記のような実行結果が得られるかと思います。


ですが、typeの値が重複したときに一行で出力したい場合は
どのようなSQL文を発行するのが良いのでしょうか?
得たい実行結果は下記となります。

実行結果

type,(連結された値)
------------------------------
1,sato-keiko
2,ito-yoko kishi-hruna    ←typeの値が同じだったので一行に
3,yasuda-fumi

色々試してはみたのですが、なかなか解決できずにいます。
もしよろしければ、お力添えお願いします。

質問者が選んだベストアンサー

  • 回答No.2
  • ベストアンサー

ベストアンサー率 43% (833/1926)

MySQLでだけ動けばいいなら、独自機能のgroup_concatという関数があります。

http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html
お礼コメント
saki_0109

お礼率 100% (3/3)

chukenkenkouさん、ご回答ありがとうございます。
MySQLにこのような関数があることには気がつきませんでした。
なんとなく統計などに使いそうなイメージだったのですが値をつなぎ合わせるという意味で簡潔なアプローチができそうです。
この方向でSQL構文を書いてみようと思います。
投稿日時:2009/09/16 19:59

その他の回答 (全2件)

  • 回答No.3

ベストアンサー率 51% (3827/7415)

#2は盲点でした。
たしかにそんな関数が追加になっていますね。

SELECT type,
GROUP_CONCAT(DISTINCT CONCAT( name1,'-',name2 )
SEPARATOR ' ')
FROM table_a
GROUP BY type;
お礼コメント
saki_0109

お礼率 100% (3/3)

yambejpさん、ご丁寧な回答ありがとうございます。
上記のSQL文で期待していた結果が得られました。

自分でもいろいろ調べたのですが、GROUP_CONCAT()は連結するカラムのなかに数値型あるとBlobで返すということもわかりました。
より汎用的数値やテキストを混合して使うときには、

SELECT type, SUBSTRING(GROUP_CONCAT(DISTINCT CONCAT(name1,'-',name2 ) SEPARATOR ' '),1)
FROM table_a
GROUP BY type;

と文字列として切り出してやることで表示できるようです。

今回はyambejpさんやchukenkenkouさんのおかげでとても勉強になりました。本当にありがとうございます。
投稿日時:2009/09/16 20:11
  • 回答No.1

ベストアンサー率 51% (3827/7415)

ダブりの数の上限値がわかっているなら、その回数だけ
joinしてconcatすればいけそうな気がします。
無理やりやるなら変数をつかっても不可能ではないでしょう。
正直言うとこれってSQLの仕事じゃない気がします
出力の際にミドルウェアで処理してみては?
補足コメント
saki_0109

お礼率 100% (3/3)

yambejpさん、ご回答ありがとうございます。
もし、yambejpさんがSQL文だけで無理やり行うとしたら
どんな感じで構文を書かれますか?
参考にしてみたいのでもしよろしければ教授いただけないでしょうか。
投稿日時:2009/09/16 12:23
お礼コメント
saki_0109

お礼率 100% (3/3)

yambejpさん、ご回答ありがとうございます。
現状、ダブりの上限は決まっているのですが今後増えることを想定すると
出力時結果をPHPなどで処理するのがいいとのこと理解いたしました。

スマートではないかもしれませんがSQL構文の勉強として変数を使う方法というのも自分なりに調べてみようと思います。
投稿日時:2009/09/16 12:20
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ