[MYSQL][PHP]SELECTでGROUP BYでまとめる

PHPからMySQLのデータをSELECTで取り出す際に、同じ値でグループ化したい場合に以下の様にSELECT文を書くんだけど・・・

SELECT * FROM テーブル名 GROUP BY カラム名

取得したいカラムのデータが数値で合計(sum)や平均(avg)を出すってのなら簡単なんだけど、文字列の場合はどうすれば良いのか少し迷ったのでメモ

id| name    | mail
---------------------
0 | 織田信長 | nobunaga***@gmail.com
1 | 豊臣秀吉 | saru*@yahoo.co.jp
2 | 徳川家康 | matsujun*@outlook.jp
3 | 織田信長 | tenka@okehazama.org
4 | 上杉謙信 | shio*@okuru.net
5 | 伊達政宗 | dokugan@ryu.biz

というt_listというテーブルがあったとしよう。この時、nameでグループ化してメールアドレスを取得する場合、『織田信長』というレコードが2つあるので

SELECT * FROM t_list GROUP BY name

とSELECTしたら『織田信長』のメールアドレスは1つしか取得出来ない
なので、GROUP_CONCATを使う

SELECT id, name, GROUP_CONCAT(mail) as mail FROM t_list ORDER BY name

こうすると、織田信長のmailカラムはカンマ(,)区切りで取得する事が出来る

nobunaga***@gmail.com,tenka@okehazama.org

後は、PHPならexplodeなどを使ってカンマ(,)で分割してやればOK!
ただ・・・データにカンマ(,)が含まれてると面倒な事になるので、拒否するかデータベースに登録する時に¸とかに変更してやった方が良いかも


この記事が気に入ったらサポートをしてみませんか?