昨日の課題が解決できた!!
SQLで一つのセルに複数のデータを入れる。
てっきりPHPでなんとかしないといけないと思ったけど、
SQL文で達成。
★やりたかったこと★
おおまかに以下の二つのようなテーブルがあった。
お互いIDで紐付いている一対多の関係。
メインマスタ
———————
ID NAME LV
1 あか II
2 しろ IV
———————
タスクテーブル
———————
ID タスク名
1 PR500
1 G10
2 P200
2 PW5
———————
■■昨日メインテーブルに、「タスクテーブル」をJOIN成功。
▽メインマスタ + タスクテーブル
————————————
ID NAME LV タスク名
1 あか II PR500
1 あか II G10
2 しろ IV P200
2 しろ IV PW5
————————————
↑構成要素が、一つの要素に対して多なので
そのぶん行が増えちゃう
↓↓↓↓↓↓↓
本当は1列に二つのタスクを紐付けたい。
上記のテーブルから、
“IDが「1」のタスク名”を全部引っ張ってきて表示~~
ということをPHPでなんとかするのかなと苦悩。
しかし今日粘り強く調べたら以下SQL文と出会った。
GROUP_CONCAT & GROUP BY
以下のように使用シマシタ!
———————
SELECT
メインマスタ.ID, メインマスタ.NAME, メインマスタ.LV, GROUP_CONCAT(タスクテーブル.タスク名)
FROM
メインマスタ
LEFT JOIN
タスクテーブル using (ID) GROUP BY ID; (←※)
(※ 最後の列は
タスクテーブル on メインマスタ.ID = タスクテーブル.ID GROUP BY ID;
でもOK)
———————
↓↓↓↓↓↓結果こうなった
■本日メインテーブルに、「タスクテーブル」を求める形でJOIN成功。
▽メインマスタ + タスクテーブル
————————————
ID NAME LV タスク名
1 あか II PR500, G10
2 しろ IV P200, PW5
————————————
やっほ~~い
一番しっくりきたのは下記サイトでした。
MySQL 1対他のデータをGROUP_CONCATで取得
でもでも欲を言えば、
もう一つ繋げたいデータテーブルもあって、それも一対多。
ほんとはこうしたい。
▽メインマスタ + タスクテーブル + 追加テーブル
—————————————————-
ID NAME LV タスク名 追加項目
1 あか II PR500, G10 ★、□、○
2 しろ IV P200, PW5 □、▲
—————————————————-
普通のJOINと違って、
上記の GROUP_CONCAT は 2回連続で使用したらエラーとなりました。
どうやったら3つ以上のテーブルをグループで繋げられるのか
非常に気になる。。
やっぱりSQL側で全部成形するのは限界があるのか??
やっぱりPHP側でなんとかするのか??
どちらにやらせる仕事か判断するにはPHPのことも結構知ってなきゃだめじゃん・・
ということで一旦最低限のところはクリアできたので次へ進もう。
[追記]
あきらめきれず調べるより
いろいろ試してみたらできちゃった!鳥肌
———————
SELECT
メインマスタ.ID, メインマスタ.NAME, メインマスタ.LV, GROUP_CONCAT(DISTINCT タスクテーブル.タスク名), GROUP_CONCAT(DISTINCT 追加テーブル.追加項目)
FROM
メインマスタ
LEFT JOIN
タスクテーブル on メインマスタ.ID = タスクテーブル.ID
LEFT JOIN
追加テーブル on メインマスタ.ID = 追加テーブル.ID GROUP BY ID;
———————
—–
コメント