重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

[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

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

A 回答 (3件)

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



http://dev.mysql.com/doc/refman/5.1/ja/group-by- …
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/16 19:59

#2は盲点でした。


たしかにそんな関数が追加になっていますね。

SELECT type,
GROUP_CONCAT(DISTINCT CONCAT( name1,'-',name2 )
SEPARATOR ' ')
FROM table_a
GROUP BY type;
    • good
    • 0
この回答へのお礼

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

ダブりの数の上限値がわかっているなら、その回数だけ


joinしてconcatすればいけそうな気がします。
無理やりやるなら変数をつかっても不可能ではないでしょう。
正直言うとこれってSQLの仕事じゃない気がします
出力の際にミドルウェアで処理してみては?

この回答への補足

yambejpさん、ご回答ありがとうございます。
もし、yambejpさんがSQL文だけで無理やり行うとしたら
どんな感じで構文を書かれますか?
参考にしてみたいのでもしよろしければ教授いただけないでしょうか。

補足日時:2009/09/16 12:23
    • good
    • 0
この回答へのお礼

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

スマートではないかもしれませんがSQL構文の勉強として変数を使う方法というのも自分なりに調べてみようと思います。

お礼日時:2009/09/16 12:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す