此 SQL 查询有问题吗?

Something wrong with this SQL query?

这个查询有问题吗?

SELECT 
    id,
    ( 6371 * acos(cos(radians(?1)) * cos(radians(latitud)) * cos(radians(longitud) - radians(?2)) + sin(radians(?1)) * sin(radians(latitud)))) AS distance 
FROM usuario_señales 
HAVING (distance < 0.1 AND ancho <= ?3) 
ORDER BY distance;

我在 spring 引导中有一个 Web 服务器,我试图根据纬度和经度获取半径为 1 米的行的 ID,并且属性 ancho 小于我的通过:

@Query(nativeQuery = true, value="SELECT id,( 6371 * acos(cos(radians(?1)) * cos(radians(latitud)) * cos(radians(longitud) - radians(?2)) + sin(radians(?1)) * sin(radians(latitud)))) AS distance FROM usuario_señales HAVING (distance < 0.1 AND ancho <= ?3) ORDER BY distance")

我得到的错误如下:

java.sql.SQLSyntaxErrorException: Unknown column 'ancho' in 'having clause'

having 子句和我的使用方式有问题。有什么线索吗?先谢谢你了。

从您的问题描述来看,您似乎不需要聚合查询。相反,您正在尝试使用 having 子句来避免在 where 子句中重复冗长的计算:MySQL 支持(即使没有 group by 子句),但在这种情况下,您只能在 having 子句中使用 select 子句中的列。

您不需要使用 having 子句来过滤 ancho,您可以使用常规的 where 子句。我认为您要写的查询是:

SELECT 
    id,
    ( 6371 * acos(cos(radians(?1)) * cos(radians(latitud)) * cos(radians(longitud) - radians(?2)) + sin(radians(?1)) * sin(radians(latitud)))) AS distance 
FROM usuario_señales 
WHERE ancho <= ?3
HAVING distance < 0.1
ORDER BY distance;

我不喜欢这种语法,它依赖于 MySQL 对标准 SQL 的扩展。我会改用子查询:

SELECT *
FROM (
    SELECT 
        id,
        ( 6371 * acos(cos(radians(?1)) * cos(radians(latitud)) * cos(radians(longitud) - radians(?2)) + sin(radians(?1)) * sin(radians(latitud)))) AS distance 
    FROM usuario_señales 
    WHERE ancho <= ?3
) t
WHERE distance < 0.1 
ORDER BY distance;