我正在尝试将两个查询合并为一个,我希望你能帮助我。
查询获取一定距离内的条目(邮政编码)列表。这很好用。 ($ lat,$ lng,$ zip和$ size现在都是硬编码的。)
现在我需要将其与搜索其他表格中与这些邮政编码匹配的条目相结合。
这是我的疑问:
SELECT
source.zc_zip,
source.zc_location_name,
ACOS(
SIN(RADIANS(zc_lat)) * SIN(RADIANS($lat))
+ COS(RADIANS(zc_lat)) * COS(RADIANS($lat)) * COS(RADIANS(zc_lon)
- RADIANS($lng))
) * 6371 AS distance
FROM zip_coordinates AS source
WHERE zc_id <> $zip
GROUP BY source.zc_zip
HAVING distance < $size
ORDER BY distance LIMIT 10;
我已经将它修改为这样,因为当source.zc_zip与info.meta_value相同时我们匹配:
SELECT
source.zc_zip,
source.zc_location_name,
info.*,
ACOS(
SIN(RADIANS(zc_lat)) * SIN(RADIANS($lat))
+ COS(RADIANS(zc_lat)) * COS(RADIANS($lat)) * COS(RADIANS(zc_lon)
- RADIANS($lng))
) * 6371 AS distance
FROM zip_coordinates AS source, wp_postmeta AS info
WHERE zc_id <> $zip AND info.meta_value = source.zc_zip
GROUP BY source.zc_zip
HAVING distance < $size
ORDER BY distance LIMIT 10;
不用说这个查询真的很慢(> 1秒)。
任何人都可以帮忙吗?谢谢! : - )
- 多米尼克
答案 0 :(得分:1)
我向OP询问了以下内容:
你想要组合2个查询,你给我一个(2个版本),但是第二个查询在哪里,第一个与第一个查询结合?
OP的回复:
- 第一个是基本查询,但它缺少我试图通过第二个查询得到的信息。第二个查询很慢,所以我正在寻找第二个替代方法,我将第一个查询与我在网上找到的东西结合起来。 - dmnkhhn 2011年8月15日18:18
$lat
,$lng
,$zip
和$size
现在都是硬编码的,因此将距离作为计算列与存储过程相加可能不是您的想法。计算值上的ORDER显然会使您创建一个临时表,其中包含所有行和计算值的索引。所以时间随着行数的增长而增长。从高中拿起你的数学书,计算你圈子周围的方格。使用这些值排除99%zc_lat
和zc_lon
的计算,包括WHERE
中的限制。
替代:昨晚考虑一下,更好的方法是以编程方式:在圆圈的内部广场中获得10个最近的生活者。这样,您不需要在查询中进行任何计算,就可以计算程序中的限制边界。
如果导致的情况太少,请使用上面的公式在内部和外部正方形之间的区域中选择另一个查询。它会像火箭一样表现:你只对一些记录进行计算,除非你的大多数客户在你试图找到10英里的圆圈时居住在9到11英里之间。