MySQL:GROUP BY with HAVING返回空集,但不使用GROUP BY

时间:2013-03-05 00:44:49

标签: php mysql group-by distance having-clause

我有一个表(cargo_route),包含以下字段:

id,
truck_id,
lat,
lon,
半径

这是一条航运路线,每一行都有一个卡车的lat,lon坐标。

我需要计算每个站点与我的(任何输入)点(lat lon)之间的距离,并在距离小于指定半径(该站点)时生成结果。 (基本上搜索城市是否在路线上或距离路线上的任何站点太远)

这是我的查询(工作正常)

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`

代码有效....但是,它给我带来了几行具有相同的truck_id,(基本上每一个停靠点都足够接近搜索点)

当我尝试“GROUP BY truck_id”来获取通过我的点的卡车的ID时,我得到一个空集:(

我可以在PHP逻辑中解决这个问题,但我宁愿让SQL返回我真正需要的东西而不是迭代数组。

我做了研究并且了解到GROUP BY首先执行并且HAVING结束“没有”距离&lt; radius因为group by抓住第一行(因此HAVING生成空集)。我也尝试了ORDER B,但没有效果。

HEre是返回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,因为'distance'是一个聚合列。

************编辑_已解决*******************

Canno回答我自己的问题:

伙计们,实际上在这里找到了答案:SELECT From MySQL View With HAVING Clause Returns Empty Result Set

基本上,把SELECT * FROM(我的查询)S WHERE distance&lt; radius GROUP BY truck_id

4 个答案:

答案 0 :(得分: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`;

答案 1 :(得分: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]

答案 2 :(得分: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`

答案 3 :(得分:0)

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