我有一个包含以下字段的表(cargo_route):
ID、
卡车 ID、
纬度、
经度、
半径
这是一条运输路线,其中每一行都是卡车的纬度,经度坐标的每一站。
我需要计算每个停靠点和我的(任何输入)点(纬度)之间的距离,如果距离小于指定的半径(对于那个停靠点),则带来结果。(基本搜索城市是否在路线上或距离路线上的任何站点太远)
这是我的查询(效果很好)
SELECT
`truck_id`,
`radius`,
(
3959 * acos(
cos(radians(39.9611755)) * cos(radians(cargo_route.lat)) * cos(
radians(cargo_route.lon) - radians(- 82.9987942)
) + sin(radians(39.9611755)) * sin(radians(cargo_route.lat))
)
) AS distance FROM
(`cargo_route`) HAVING `distance` < `radius`
该代码有效....但是,它给我带来了几行具有相同卡车ID的行,(基本上每个停靠点都足够接近搜索点)
当我尝试“GROUP BY truck_id”以仅获取通过我的点的卡车的 ID 时,我得到一个空集:(
我可以在 PHP 逻辑中解决这个问题,但我宁愿让 SQL 返回我真正需要的东西,也不愿遍历数组。
我进行了研究并了解到 GROUP BY 首先执行并且 HAVING 最终“没有”距离 < 半径,因为 group by 抓住了第一行(因此 HAVING 产生了空集)。我也试过 ORDER B 但它没有效果。
这是返回 EMPTY SET 的查询
SELECT
`truck_id`,
`radius`,
(
3959 * acos(
cos(radians(39.9611755)) * cos(radians(cargo_route.lat)) * cos(
radians(cargo_route.lon) - radians(- 82.9987942)
) + sin(radians(39.9611755)) * sin(radians(cargo_route.lat))
)
) AS distance FROM
(`cargo_route`) GROUP BY truck_id HAVING `distance` < `radius`
问题: 有没有办法执行 HAVING 然后分组?也许语法略有不同?
我尝试重新排序 HAVING 和 GROUP BY 但它给我一个错误。另外,我不能使用 WHERE,因为“距离”是一个聚合列。
************编辑_已解决********************
无法回答我自己的问题:
伙计们,实际上在这里找到了答案:SELECT From MySQL View With HAVING Clause Returns Empty Result Set
基本上,把 SELECT * FROM (my query) S WHERE distance < radius GROUP BY truck_id