Haversine公式SQL查询中的记录分组和计数

3
我正在开发一个车辆交易网站。我有一个名为“vehicle”的表,其中包括车辆的制造商、型号等约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辆宝马汽车(系统中总共有325辆宝马汽车),而不是12辆宝马汽车(只有10辆车在10英里范围内)。 有人能看出我做错了什么吗?谢谢你的帮助。

你需要先进行筛选,再进行分组。 - Tim3880
2个回答

2
您需要在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的则是正确的。顺便说一下,非常感谢你的答案。 - Hammad
"<10"和"<=10"的区别是什么? - Tim3880

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接