データの見せ方について。 mySQL にやらせる仕事か PHPにやらせる仕事か

MySQL

昨日の課題が解決できた!!

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; 
———————

—–

コメント

タイトルとURLをコピーしました