【问题标题】:Something wrong with this SQL query?这个 SQL 查询有问题吗?
【发布时间】:2020-08-26 17:37:41
【问题描述】:

这个查询有问题吗?

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

have 子句和我如何使用它有问题。有什么线索吗?提前谢谢你。

【问题讨论】:

  • HAVING 表达式可以引用 GROUP BY 中使用的源表列/表达式(此子句在您的查询中不存在)或输出列名/别名(ancho 列名/别名在输出列列表)或源表列/表达式未在 GROUP BY 中使用但用聚合函数包装。所以查询是错误的。
  • 所以我需要在 HAVING 子句之后放置 GROUP BY ancho 吗?因为它不起作用。现在是 SQL 语法错误。
  • anchousuario_señales 中的列吗?如果是这样,则将此列的条件移至 WHERE 子句。
  • @Akina 谢谢!现在已经解决了。

标签: mysql sql spring where-clause having-clause


【解决方案1】:

从您的问题描述来看,您似乎不需要聚合查询。相反,您尝试使用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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2011-01-15
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多