-1

我有一个包含以下字段的表(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

4

4 回答 4

2

问题:有没有办法执行 HAVING 然后分组?

HAVING用于过滤输出数据。WHERE对输入数据进行操作。

你必须使用一些子查询,也许像这样。

SELECT `truck_id`, `radius`, `distance`
FROM
(
    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`;
于 2013-03-05T00:55:07.513 回答
1

请记住,这having意味着要使用聚合数据(也就是说,如果要使用,having则需要定义分组标准)。

我保留的快速指南是这样的:

select [the data you want]
from [the tables you have]
where [the filters you need to apply ON YOUR "RAW" DATA]
group by [your grouping criteria]
having [the filters you need to apply TO THE GROUPED DATA]
于 2013-03-05T00:49:34.630 回答
1

MySQL 让你误入歧途。适合您的语法实际上是非法的。

根据您陈述的意图,haing 子句应该是 where。

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`) where (
    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))
    )
)` < `radius`
于 2013-03-05T00:56:57.473 回答
0

如果您将距离评估直接移动到 WHERE 子句,它可能会起作用。您还可以将所有内容(不带 GROUP BY)包装到子查询中和父查询中的 GROUP BY 中。

于 2013-03-05T00:46:39.227 回答