【问题标题】:Grouping and counting of records in Haversine Formula SQL QueryHaversine 公式 SQL 查询中记录的分组和计数
【发布时间】:2015-08-14 04:09:10
【问题描述】:

我正在开发一个汽车交易网站。我有一个名为车辆的表,其中包含大约 20 个字段,包括车辆的品牌、型号等。我正在编写一个搜索查询,以按品牌检索系统组中的所有汽车以及它们的数量。

因此,我的目标是让系统中的所有车辆按其品牌及其数量进行分组,但数量部分无法正常工作。它通过忽略我的距离计算标准来返回汽车总数。

我正在执行以下 SQL:

SELECT * FROM (SELECT *,ROUND(((ACOS(SIN(51.4811109 * PI() / 180) * SIN(latitude * PI() / 180) + COS(51.4811109 * PI() / 180) * COS(latitude * PI() / 180) * COS((-0.433641 - longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515),2) AS distance, count(make) AS carcount FROM `vehicle` `t` WHERE (status='Active')) as v GROUP BY make HAVING distance<=10  

它返回的一切都是正确的,除了 carcount 它返回系统中的 325 辆宝马汽车(系统中的宝马汽车总数)而不是 12 辆宝马汽车(10 英里距离内只有 10 辆汽车)。

谁能看到我做错了什么?感谢您的帮助。

【问题讨论】:

  • 你需要先过滤,再分组。

标签: php mysql sql sql-server haversine


【解决方案1】:

你需要在where子句中没有条件

SELECT *, count(*)
FROM 
(SELECT *,ROUND(((ACOS(SIN(51.4811109 * PI() / 180) * 
              SIN(latitude * PI() / 180) + COS(51.4811109 * 
              PI() / 180) *
              COS(latitude * PI() / 180) * 
              COS((-0.433641 - longitude) * PI() / 180)) *
              180 / PI()) * 60 * 1.1515),2) AS distance
FROM `vehicle` `t` 
WHERE (status='Active')) as v
WHERE distance<=10 
GROUP BY make 

【讨论】:

    【解决方案2】:

    试试这个

    SELECT make, count(*) 
    FROM vehicle
    Where 
    ROUND(((ACOS(SIN(51.4811109 * PI() / 180) * SIN(latitude * PI() / 180) + COS(51.4811109 * PI() / 180) * COS(latitude * PI() / 180) * COS((-0.433641 - longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515),2) <= 10
        And status='Active
      GROUP BY make
    

    【讨论】:

    • 我已经尝试过你的和 Ala 的 SQL。你的计数不正确,而 Ala 的计数正确。非常感谢您的回答。
    • 也许是“
    猜你喜欢
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多