検索結果の表示 GROUP_CONCATのままではだめ??

PHP

前回で検索は作ったのだけど、
検索結果の表示で一苦労ありました。

一覧作成時(この時)にGROUP_CONCATを使っていたので
同じ一覧の形で検索結果一覧も作ったのですが・・

▼普通の全一覧のとき。
GROUP_CONCATを使って、
1対多の「多」にあたる複数の「タスク名」を1セルに表示していました。
(下記のタスク名のところが別テーブル)


▽メインマスタ + タスクテーブル
————————————
ID   NAME   LV   タスク名

1    あか    II    PR500, G10
2    しろ    IV    P200, PW5
————————————

タスク名で「P」で検索すると・・

▼タスク名で「P」での検索結果


▽メインマスタ + タスクテーブル
————————————
ID   NAME   LV   タスク名

1    あか    II    PR500
2    しろ    IV    P200, PW5
————————————

あぁっガーン1番から「G10」が消えている・・ううっ...

タスク名に「P」を含むタスクだけが表示されるってこと?

タスク名に「P」を含むID&NAMEを重複なしで
すべてひっぱってくるという目的は果たしているのですが、
そいつがもつタスクは全部表示しておいてほしい・・・

GROUP_CONCATで、mySQLで繋いで出しているから、
検索に引っかからない「G10」は消えているのか。。

どうしよう。

そこで前回の記事でも書いた
検索を作ったときの「implode」を思い出した。

sql側でがっちゃんこしないで、

PHP側で、検索結果のIDに紐付く全タスクを抽出して
カンマでがっちゃんこして表示すれば消えない・・となんとなく想像。

~~~~~~~~~~~~~~~~~~
$sql = “SELECT メインマスタ.ID, メインマスタ.NAME, メインマスタ.LV, GROUP_CONCAT(DISTINCT タスクテーブル.タスク名)
FROM メインマスタ
LEFT JOIN
タスクテーブル using (ID) GROUP BY ID;

echo”<table>”;

$res = mysql_query( $sql, $・・ )

WHILE( $row = mysql_fetch_assoc($res) )
{
extract($row);
echo”<tr>”;
echo”<td>” . $row[“ID”] . “</td>”;
echo”<td>” . $row[“NAME”] . “</td>”;
echo”<td>” . $row[“LV”] . “</td>”;

$sql2 = “SELECT タスク名 FROM タスクテーブル WHERE ID=’$ID‘”;
$res2 = mysql_query( $sql2, $・・ );

$arr = array();
WHILE( $row2 = mysql_fetch_assoc($res2) )
{
$arr[] = $row2[“タスク名”];
}
$mix_タスク名 = implode(“,”, $arr);

echo”<td>” . $mix_タスク名 . “</td>”;

echo”</tr>”;
}
echo”</table>”;
~~~~~~~~~~~~~~~~~~

これでできたひらめき電球

1個目の$sqlのところはもはやGROUP_CONCATはいらない?と思ったけど、
複数GROUP_CONCATしたいときとか、
なくすと検索結果が重複してでてきてしまったので、
最初の検索はそのままに。
(なぜか一個目の$sqlのIDとかで重複削除のDISTINCTはかけたくなかった。直感で・・)

出力のところだけ$sql2で、検索された結果$IDに紐付くタスク名を取ってきて、
ここはPHPで加工してコンマで繋げた1ワード(mix_タスク名)にして、
表示させました。

これで、タスク名「P」で検索してもちゃんと下記のとおり


▽メインマスタ + タスクテーブル
————————————
ID   NAME   LV   タスク名

1    あか    II    PR500, G10
2    しろ    IV    P200, PW5
————————————

P以外のタスクG10もでてきたにひひ

ベストの方法かは分からないけど
一旦思い通りの結果を取得ラブラブ

—–

コメント

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