1

我有一个可能很基本的问题,但完全让我感到困惑。

我有一个网站可以从某个位置提取附近的邮政编码(即,如果我将我的位置设为密歇根州底特律,那么我会得到邮政编码 48201、48272、48260、48226、48255、48275、48267、48231、48268、48278 等。 ) 它获取的数量是可变的(底特律获得 28,巴尔的摩,马里兰州获得 15)。

该网站正在抓取附近的鲜花递送地点(在这种情况下,该地点是殡仪馆)。

如果当前邮政编码(即 48201)中没有殡仪馆,则应检查相邻邮政编码$zipListArray(48272 等),直到找到 5 个结果。

我尝试了两种不同的代码...

$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 功能在数据库中添加坐标。或者,如果它不可用haversine 公式

附言

最近的邮政编码通常不是最近的位置。为此使用一些 GEO / maps API。

更新

我有点误读了你的问题,但我最初的陈述仍然有效。对这种事情进行多次查询是一个愚蠢的想法

我现在才看到您已经有一个要检查的 ziplist。尽管我仍然认为如果您真的想走那条路线,这可能不是最佳方法,但您应该使用in()运算符。

于 2012-09-10T16:26:20.657 回答
0

你最好WHERE ... IN搜索所有可能的邮政编码,例如

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

这样,您只运行一个查询,您可以获得所有可能的 zip,并且您可以添加 LIMIT 子句以将结果限制为仅 5 行 - 或仅获取最多 5 行。无论哪种方式,您都消除了 for() 循环,因此您不会以无限循环结束,以防一开始附近没有 5 个以上的花卉位置。

于 2012-09-10T16:27:38.693 回答
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 条,您可以对列表中的所有其他邮政编码进行第二次查询,将结果数限制为提供 5 条所需的数量全部的。这将最多对数据库进行 2 次查询。

我个人会使用 Google API 或 MySQL 空间扩展 (http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html) 来完成这项工作。

于 2012-09-10T16:32:44.460 回答
-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 回答