- ベストアンサー
mysqlのSQL文の書き方についてご質問いたします。
下記のようなテーブルがあるとします。 [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 色々試してはみたのですが、なかなか解決できずにいます。 もしよろしければ、お力添えお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
MySQLでだけ動けばいいなら、独自機能のgroup_concatという関数があります。 http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
#2は盲点でした。 たしかにそんな関数が追加になっていますね。 SELECT type, GROUP_CONCAT(DISTINCT CONCAT( name1,'-',name2 ) SEPARATOR ' ') FROM table_a GROUP BY type;
お礼
yambejpさん、ご丁寧な回答ありがとうございます。 上記のSQL文で期待していた結果が得られました。 自分でもいろいろ調べたのですが、GROUP_CONCAT()は連結するカラムのなかに数値型あるとBlobで返すということもわかりました。 より汎用的数値やテキストを混合して使うときには、 SELECT type, SUBSTRING(GROUP_CONCAT(DISTINCT CONCAT(name1,'-',name2 ) SEPARATOR ' '),1) FROM table_a GROUP BY type; と文字列として切り出してやることで表示できるようです。 今回はyambejpさんやchukenkenkouさんのおかげでとても勉強になりました。本当にありがとうございます。
- yambejp
- ベストアンサー率51% (3827/7415)
ダブりの数の上限値がわかっているなら、その回数だけ joinしてconcatすればいけそうな気がします。 無理やりやるなら変数をつかっても不可能ではないでしょう。 正直言うとこれってSQLの仕事じゃない気がします 出力の際にミドルウェアで処理してみては?
お礼
yambejpさん、ご回答ありがとうございます。 現状、ダブりの上限は決まっているのですが今後増えることを想定すると 出力時結果をPHPなどで処理するのがいいとのこと理解いたしました。 スマートではないかもしれませんがSQL構文の勉強として変数を使う方法というのも自分なりに調べてみようと思います。
補足
yambejpさん、ご回答ありがとうございます。 もし、yambejpさんがSQL文だけで無理やり行うとしたら どんな感じで構文を書かれますか? 参考にしてみたいのでもしよろしければ教授いただけないでしょうか。
お礼
chukenkenkouさん、ご回答ありがとうございます。 MySQLにこのような関数があることには気がつきませんでした。 なんとなく統計などに使いそうなイメージだったのですが値をつなぎ合わせるという意味で簡潔なアプローチができそうです。 この方向でSQL構文を書いてみようと思います。