• ベストアンサー

php+mysql 重複した値を消す?

初めての投稿です。初心者なのでうまく表現できないのですが、よろしくお願いします。カテゴリーが mysql だったらすみません。 さて、mysqlからデータを呼び出します。 1.テーブル名 net <フィールド名> cityname ff10 ff11 ff12 <データ1> sel 1000 1000 2000 <データ2> pus 1500 1500 1000 <データ3> tpe 3000 2000 2000 2.テーブル名 cityname <フィールド名> cityname kuni cityname2 houmen <データ1> sel 韓国 ソウル 7 <データ2> pus 韓国 プサン 7 <データ3> cju 韓国 チェジュ 7 <データ4> tpe 台湾 台北 7 ブラウザー上にあらわしたいこと 韓国 ソウル    プサン 台湾 台北      のように、重複する[韓国]をひとつだけにしたいのです。 下記コードの場合 韓国 ソウル 韓国 プサン 台湾 台北 となってしまいます。 $sql_houmen = "select kuni,cityname,cityname2 from cityname where houmen =7"; $sql_houmen = mb_convert_encoding($sql_houmen, "EUC-JP", "SJIS"); $result_houmen = mysql_query($sql_houmen); while($rec_houmen = mysql_fetch_array( $result_houmen, MYSQL_ASSOC )) {// foreach ($rec_houmen as $k=>$v) {// $rec_houmen[$k] = mb_convert_encoding($v,'SJIS','EUC-JP'); }// //$fsdateにデータがあるか確認 $sql_crr = "select crr,cityname from {$fsdate} where cityname like '%$rec_houmen[cityname]%' and cls='y' and crr = '{$crr}'"; $sql_crr = mb_convert_encoding($sql_crr, "EUC-JP", "SJIS"); $result_crr = mysql_query($sql_crr); if (mysql_num_rows($result_crr) > 0) {// echo "$rec_houmen[kuni]$rec_houmen[cityname2]"; }// }

質問者が選んだベストアンサー

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

fetchしたレコードの国名が一度出てきたかを格納する配列を用意しておき、既出なら国名でなく、その文字数分の空白を出力するようにしてみました。デバッグしてないので、うまくいかなかったらすみません。 unset $kuni_selected; $sql_houmen = "select kuni,cityname,cityname2 from cityname where houmen =7"; $sql_houmen = mb_convert_encoding($sql_houmen, "EUC-JP", "SJIS"); $result_houmen = mysql_query($sql_houmen); while($rec_houmen = mysql_fetch_array( $result_houmen, MYSQL_ASSOC )) {// foreach ($rec_houmen as $k=>$v) {// $rec_houmen[$k] = mb_convert_encoding($v,'SJIS','EUC-JP'); }// //$fsdateにデータがあるか確認 $sql_crr = "select crr,cityname from {$fsdate} where cityname like '%$rec_houmen[cityname]%' and cls='y' and crr = '{$crr}'"; $sql_crr = mb_convert_encoding($sql_crr, "EUC-JP", "SJIS"); $result_crr = mysql_query($sql_crr); if (mysql_num_rows($result_crr) > 0) {// if (isset($kuni_selected($rec_houmen[kuni]))) { echo str_repeat(" ",strlen($rec_houmen[kuni])) . "$rec_houmen[cityname2]"; } else { echo "$rec_houmen[kuni]$rec_houmen[cityname2]"; $kuni_selected($rec_houmen[kuni]) = TRUE; } }// }

takotan2
質問者

補足

ham_kamo 様 レスありがとうございました。初心者なので一番わかりやすそうでしたので、試してみたのですが上手くいきません。。。(ちょっとコードを変えるなり試行錯誤してみたのですが。。) 「レコードの国名が一度出てきたかを格納する配列」とは、$kuni_selected($rec_houmen[kuni])でしょうか?そこに1番最初の「韓国」が入ったとして、その後の$kuni_selected($rec_houmen[kuni]) = TRUE;がわかりません。。。(スミマセン) 私のやりたい事の通りなのですが、もう一度お願いできませんでしょうか?本当に申し訳ないのですが、よろしくお願いします。

その他の回答 (3)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.4

No.1です。 大変失礼いたしました。全くデバッグしてなかったので、やはり誤りがありました。(最近PHPやCでなくVBでコードを書く機会が多く、配列を[]でなく()で書くという初歩的なミスを犯していました) 最後のif文を以下のように訂正いたします。 if (isset($kuni_selected[$rec_houmen[kuni]])) { echo str_repeat(" ",strlen($rec_houmen[kuni])) . "$rec_houmen[cityname2]"; } else { echo "$rec_houmen[kuni]$rec_houmen[cityname2]"; $kuni_selected[$rec_houmen[kuni]] = TRUE; }

takotan2
質問者

お礼

No.1さま 出来ました!!!何故か unset $kuni_selected; を抜かしてみたら、希望通りの表示になりました。本当にありがとうございました。 1週間位悩んでいたのですが、これですっきりです。 本当に感謝です!

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

まぁ折角なのでMySQL側でやる方法を。 SET @KUNI=""; SELECT @KUNI:=IF(kuni=@KUNI,"",`kuni`) AS `kuni`,`cityname2` FROM `cityname` INNER JOIN `net` ON `cityname`.`cityname`=`net`.`cityname`;

takotan2
質問者

お礼

yambejp様 レスありがとうございました。まだ初心者なので、No.1さんの回答が入りやすかったので、とりあえずNo.1さんの方法を取らせていただきました。今後勉強していきたいと思います。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

//$fsdateにデータがあるか確認 が何をしているか分かりませんが、 cityname.cityname が net.cityname にある場合だけデータを出力したいということでしょうか? $data = array(); $sql = "select cityname.cityname,kuni,cityname2 from cityname"; $sql .= " left join net on cityname.cityname = net.cityname "; $sql .= " where houmen =7 and net.cityname is not null"; $rs = mysql_query($sql); while($row=mysql_fetch_array($re)){ $data[$row['kuni']][] = $row['cityname2']; } foreach($data as $k => $v) { print "$k "; $i=0; #フラグ foreach ($v as $d) { if ($i){print'  ';} #スペースを入れる print $d; print "<br>\n"; $i++; } }

takotan2
質問者

お礼

moon_night様 レスありがとうございました。yambejp様と同じで、まだ初心者のため、No.1さんの回答が入りやすかったため、とりあえずNo.1さんの方法を取らせていただきました。今後勉強していきたいと思います。

関連するQ&A