我有一个地址数据库,并且正在我的网站上设置一个地图搜索选项。该数据库具有诸如地址,价格,BedOfBedrooms,BathOfBathrooms,纬度,经度等数据。用户可以选择按城市和价格进行搜索。用户单击搜索按钮后,我将构建我的sql查询并返回结果。如何设置4个单独变量(即最高纬度,最低纬度,最高纬度和最低纬度)的纬度和经度范围,以便为Google地图设置边界?
mysql查询示例:
SELECT * FROM table WHERE City = "city" AND Price BETWEEN "100000" AND "200000"
假设它返回了50个结果。进行更多的sql查询以查找最小和最大lat / lng坐标会更有效,还是有一种方法可以仅使用一个更快的查询来遍历结果以查找最小/最大lat / lng?< / p>
编辑:我应该指出,我还需要它来返回所有其他列以及最高和最低的lat / lng
答案 0 :(得分:1)
您可以在MySQL <8中做到这一点:
SELECT id, price, lat, lng, maxlat, minlat, maxlng, minlng
FROM places
FULL JOIN
(SELECT MAX(lat) maxlat, MIN(lat) minlat, MAX(lng) maxlng, MIN(lng)
minlng FROM places) a
WHERE price BETWEEN 100 AND 250
这会将边界设置为完整数据集。如果希望边界在结果集中,则需要将WHERE
条件复制到子查询中。这需要对表进行两次扫描,因此您需要确定这种情况是否有效。
使用MySQL版本8,您可以定义一次查询并按以下方式扫描结果:
WITH myQuery AS
(SELECT id, price, lat, lng
FROM places
WHERE price BETWEEN 100 AND 250)
SELECT * FROM myQuery FULL JOIN (SELECT Max(lat), MIN(lat), MAX(lng), MIN(lng) FROM myQuery) a
这可能是最有效的基于SQL的解决方案。
否则,您可以这样做:
$result = mysqli_query($connection,"SELECT id, price, lat, lng
FROM places
WHERE price BETWEEN 100 AND 250");
while ($result = mysqli_fetch_assoc($result)) {
$maxLng = (!isset($maxLng) || $result['lng'] > $maxLng) ? $result['lng'] : $maxLng;
//etc..
}
如果您已经将结果作为现有代码的一部分循环了,那将是最有效的,我怀疑您是这样。