【问题标题】:Looking to combine two queries希望结合两个查询
【发布时间】:2011-08-15 13:08:46
【问题描述】:

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

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

有人可以帮忙吗?谢谢! :-)

– 多米尼克

【问题讨论】:

    标签: mysql database wordpress relation


    【解决方案1】:

    我向 OP 询问了以下内容:

    你想合并 2 个查询,给我一个(有 2 个版本),但第二个查询在哪里,要与第一个合并?

    OP 的回复:

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

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

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

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

    【讨论】:

    • 第一个是基本查询,但它缺少我试图通过第二个查询获得的信息。第二个查询很慢,所以我正在寻找第二个查询的替代方法,将第一个查询与我在网上找到的内容结合起来。
    • $lat、$lng、$zip 和 $size 目前是硬编码的,因此将距离添加为带有存储过程的计算列可能不是您的想法。计算值上的 ORDER 显然使您创建一个包含所有行的临时表和计算值上的索引。所以时间随着行数的增加而增长。从高中拿你的数学书,计算你的圆圈周围的正方形。使用这些值将 99% 的 zc_lat 和 zc_lon 排除在计算之外,包括 WHERE 中的那些限制
    • 昨晚想了想,我认为更好的方法是编程:在圆圈的内部正方形中找到 10 个最近的活人。这样您就不需要在查询中进行任何计算,而是在程序中计算限制边界。如果结果太少,请使用上面的公式在内部和外部正方形之间的区域中编写另一个查询选择。它将像火箭一样运行:您只对一些记录进行计算,除非您的大多数客户在您试图找到 10 英里的圆圈时恰好居住在 9 到 11 英里之间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多