1

おそらくかなり基本的な問題がありますが、完全に困惑しています。

場所から近くの郵便番号を取得する Web サイトがあります (つまり、場所をミシガン州デトロイトにすると、郵便番号 48201、48272、48260、48226、48255、48275、48267、48231、48268、48278 などになります。 )それがつかむ量は可変です(デトロイトは28、ボルチモア、MDは15を取得します).

Web サイトは、花の配達のために近くの場所を取得しています (この場合、場所は葬儀場です)。

現在の郵便番号 (つまり 48201) に葬儀場がない場合、$zipListArray5 件の結果が見つかるまで (48272 など) から近隣の郵便番号をチェックする必要があります。

私は2つの異なるコードを試しました...

$num_rows = mysql_num_rows($result); //This is from the previous query, where it checks the immediate zip code
$i = 0;
while ($num_rows < 5) {
   $result = mysql_query('SELECT funeralh_name, address1, city, state_abbr, zipcode, phone FROM funeral_homes WHERE city != "" AND zipcode = "'.$zipListArray[$i].'" AND state_abbr = "'.$abbr.'"');
   $num_rows = mysql_num_rows($result);
   $i++;
}

このコードは、近隣に 5 つの葬儀場がない小さな都市または都市のグループでは、無限ループになります。

$inc = 0;
if ($num_rows == 0) {
   foreach ($zipListArray as $zip) {
      $result = mysql_query('SELECT funeralh_name, address1, city, state_abbr, zipcode, phone FROM funeral_homes WHERE zipcode = "'.$zip[$inc].'"');
      $total = 0;
      $num_rows = mysql_num_rows($result);
      $total += $num_rows;
      if ($total == 5){
         break;
      }
      $inc++;
      }
}

これは私がまったく仕事に就くことができませんでした。

4

4 に答える 4

3

これはひどいアイデアのように思えます (得られる情報が得られるまでデータベースにクエリを実行する)。

クエリを改善して、1 回のクエリで最も近い郵便番号を取得するようにしないでください (abs()関数を調べてください)。

または、データベース エンジンの GEO 関数を使用してデータベースに座標を追加します。または、harsine式が利用できない場合。

PS

最寄りの郵便番号は、多くの場合、最寄りの場所ではありません。そのためにいくつかのGEO /マップAPIを使用してください。

アップデート

私はあなたの質問を少し読み違えましたが、私の最初の声明はまだ有効です。この種のことに対して複数のクエリを実行するのはばかげた考えです

チェックするziplistがすでにあることがわかりました。本当にそのルートに行きたいのであれば、これは最適なアプローチではないかもしれませんが、in()演算子を使用する必要があります。

于 2012-09-10T16:26:20.657 に答える
0

ループ内でデータベースに対して複数のクエリを実行するのではなく、良いアプローチとは思えません。PeeHaa は彼の回答でいくつかの良い提案をしていますが、地理位置情報技術について心配したくない場合は、次のような単一のクエリを実行してみませんか?

SELECT funeralh_name, address1, city, state_abbr, zipcode, phone
FROM funeral_homes WHERE zipcode IN ('12345', '23456', ...)
ORDER BY zipcode ASC

つまり、より大規模なデータ セットを処理し、結果セットを手動で調べて、最初に郵便番号が完全に一致するものを見つけてから、別のものを調べる必要があります。しかし、これは、地理空間データを操作するよりも問題が少ないかもしれません。

または、最初LIMIT 5に郵便番号のみで検索を実行し、5 件未満のレコードが返された場合は、リスト内の他のすべての郵便番号に対して 2 番目のクエリを実行して、結果の数を 5 件を取得するのに必要な数に制限することができます。合計。これにより、データベースに対して最大 2 つのクエリが実行されます。

個人的には、Google API または MySQL 空間拡張機能 (http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html) を使用してこの作業を行います。

于 2012-09-10T16:32:44.460 に答える
0

WHERE ... IN考えられるすべての郵便番号を検索したほうがよいでしょう。たとえば、

$zips = implode(',', $zipListArray);
$sql = "SELECT ... WHERE ... AND zipcode IN ($zips)";
                                         ^^^^^^^^^^

このようにして、1 つのクエリのみを実行し、可能なすべての zip を取得し、LIMIT 句を追加して結果を 5 行のみに制限するか、最大 5 行のみをフェッチすることができます。いずれにせよ、その for() ループを排除することで、そもそも 5 つ以上の花の場所が近くにない場合に無限ループにならないようにします。

于 2012-09-10T16:27:38.693 に答える
-1
if ($num_rows == 0) {
    $zips = implode(', ', $zipListArray);
    $result = mysql_query('SELECT funeralh_name, address1, city, state_abbr, zipcode, phone FROM funeral_homes WHERE zipcode IN (' . $zips . ') LIMIT 5');
}
于 2012-09-10T16:30:43.037 に答える