前回で検索は作ったのだけど、
検索結果の表示で一苦労ありました。
一覧作成時(この時)に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もでてきた
ベストの方法かは分からないけど
一旦思い通りの結果を取得
—–
コメント