问题描述
此查询是否有问题?
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")
我得到的错误如下:
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;