这个SQL查询有问题吗?

问题描述

查询是否有问题?

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;

我在春季启动中有一台Web服务器,并且我试图根据经度和经度以及属性ancho小于我通过的行,获取半径为1米的行的ID:

@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:“具有子句”中的未知列“ ancho”

having子句及其使用方式存在问题。有什么线索吗?谢谢你。

解决方法

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

您不需要使用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;

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

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;