PHP如果从第一个MySQL查询得到零,则循环另一个查询直到找到结果

时间:2012-09-10 16:22:46

标签: php mysql loops

我遇到的问题可能非常基本,但让我很困惑。

我有一个网站从一个位置拉出附近的邮政编码(即如果我在密歇根州底特律的位置,那么我得到邮政编码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 个答案:

答案 0 :(得分:3)

这听起来像是一个糟糕的主意(直到你得到你所拥有的东西来查询数据库)。

为什么不改进查询,以便在1个查询中获取最近的邮政编码(查看abs()函数)?

或者在数据库中添加坐标以使用数据库引擎的GEO功能。或者,如果它不可用haversine formula

P.S。

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

<强>更新

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

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

答案 1 :(得分:0)

你最好对WHERE ... IN搜索所有可能的zipcodes,例如

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

这样,您只运行一个查询,获得所有可能的拉链,并且可以添加LIMIT子句以将结果限制为仅5行 - 或者仅获取最多5行。无论哪种方式,你都消除了for()循环,这样你就不会有无限循环,以防第一个地方没有5个以上的花地。

答案 2 :(得分: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)来完成这项工作。

答案 3 :(得分:-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');
}