我遇到的问题可能非常基本,但让我很困惑。
我有一个网站从一个位置拉出附近的邮政编码(即如果我在密歇根州底特律的位置,那么我得到邮政编码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++;
}
}
这个我根本无法工作。
答案 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');
}