0

我正在尝试将两个查询合二为一,希望您能帮助我。

该查询为我获取一定距离内的条目(邮政编码)列表。这工作得很好。($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 秒)。

任何人都可以帮忙吗?谢谢!:-)

– 多米尼克

4

1 回答 1

1

我问了OP以下内容:

您想组合 2 个查询,给我一个(在 2 个版本中),但是第二个查询在哪里,与第一个查询组合的那个呢?

OP的回复:

  • 第一个是基本查询,但它缺少我试图通过第二个查询获得的信息。第二个查询很慢,所以我正在寻找第二个查询的替代方法,将第一个查询与我在网上找到的内容结合起来。– dmnkhhn 2011 年 8 月 15 日 18:18

$lat, $lng,$zip并且$size现在是硬编码的,因此将距离添加为带有存储过程的计算列可能不是您的想法。计算值上的 ORDER 显然使您创建一个包含所有行的临时表和计算值上的索引。所以时间随着行数的增加而增长。从高中拿你的数学书,计算你的圆圈周围的正方形。zc_lat使用这些值将 99% 的和排除zc_lon在计算之外,包括WHERE.

替代方案:昨晚考虑了一下,更好的方法是编程:在圆圈的内部正方形中找到 10 个最近的活人。这样您就不需要在查询中进行任何计算,而是在程序中计算限制边界。

如果它导致的情况太少,请使用上面的公式在内部和外部正方形之间的区域中编写另一个查询选择。它将像火箭一样运行:您只对一些记录进行计算,除非您的大多数客户在您试图找到 10 英里的圆圈时恰好居住在 9 到 11 英里之间。

于 2011-08-15T16:17:19.450 回答