- ベストアンサー
データの絞込み
はじめまして。 いつもこのサイトを参考に勉強しております。(MySql、PHP) データの絞込みでつまづいておりますので、 ぜひアドバイスを頂きたいと思います。 種類|色 犬|黒 犬|白 猫|白 というデータがあり、 ■犬 ・黒 ・白 ■猫 ・白 というような結果を得たいのです。 $sql = "select distinct 種類,色 from テーブル;"; $rst = mysql_query($sql, $con) or die("データ抽出エラー"); print "<P>■{種類}</P>\n"; while ($row = mysql_fetch_array($rst, MYSQL_ASSOC)) { print "<P>{$row['色']}</P>\n"; } どこが間違っているのか教えてください。 宜しくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
1.最初に種類だけ取得して、その後色を取得する方法 $sql = "select distinct 種類 from テーブル;"; $rst = mysql_query($sql, $con) or die("データ抽出エラー"); while ($row = mysql_fetch_array($rst, MYSQL_ASSOC)) { print "<P>■{$row['種類']}</P>\n"; $sql = "select distinct 色 from テーブル where 種類='".$row['種類']."';"; $rst2 = mysql_query($sql, $con) or die("データ抽出エラー"); while ($row = mysql_fetch_array($rst2, MYSQL_ASSOC)) { print "<P>{$row['色']}</P>\n"; } } 2.一度連想&多次元配列にしてしまう方法 $sql = "select 種類,色 from テーブル;"; $rst = mysql_query($sql, $con) or die("データ抽出エラー"); while ($row = mysql_fetch_array($rst, MYSQL_ASSOC)) { $data[$row['種類']][] = $row['色']; } foreach($data as $kind=>$colors) { print "<P>■{$kind}</P>\n"; foreach($colors as $color) { print "<P>{$color}</P>\n"; } }
その他の回答 (2)
- myaa_myu
- ベストアンサー率52% (9/17)
No1です。 これが正解というわけではありませんが、こういう方法があります。 比較用の種類変数$b_kindsを用意して、ひとつ前の抽出結果と比較します。 同じじゃなかったら種類をprint、同じだったらprintしないという方法です。 あと、mysql_fetch_arrayの第2引数をMYSQL_NUMに代えて、$row配列ではなくそれぞれ変数に入れました。 $sql = "select distinct 種類,色 from テーブル;"; $rst = mysql_query($sql, $con) or die("データ抽出エラー"); $b_kinds = ''; // 比較用の種類 while (list($kinds,$color) = mysql_fetch_array($rst, MYSQL_NUM)) { if($b_kinds != $kinds){ print "<P>{$kinds}</P>\n"; } print "<P>{$color}</P>\n"; $b_kinds = $kinds; } 実際動かしていないので、きちんと動作するか微妙ですが、 ご参考までにどうぞ(動かなかったらごめんなさい;) もっとスマートな方法があると思いますので、ご参考までにどうぞ。
お礼
早急なアドバイスありがとうございました。 試してみたらきちんと動作しました。 しかし、もう一度同じ内容のデータを追加すると 同じ項目が並んでしまうので、上記kirin_fさんの1を 利用することにしました。 いろいろとありがとうございました。 今後ともよろしくお願いします。
- myaa_myu
- ベストアンサー率52% (9/17)
どのようにエラーが出るのかは分かりませんが、この部分がちょっと気になりました。 誤)$sql = "select distinct 種類,色 from テーブル;"; 正)$sql = "select distinct 種類,色 from テーブル"; ※閉じるときの”(ダブルクォーテーション)の前に;(セミコロン?)はいらない。 ご参考になれれば幸いです。
補足
ありがとうございます。;は要らないんですね(汗 勉強になりました。 セミコロンを外してみましたが、 ■(なにも表示されない) 黒 白 白 となってしまうのです。宜しくお願いします。
お礼
ありがとうございました。 1を使わせていただきます。 求めていた結果を得ることができてスッキリしました。 同じ結果を出すのにもいろいろな方法があるんですね。 まだまだ勉強不足です。 2の方も今後の参考にしたいと思います。 今後ともよろしくお願いします。