gpt4 book ai didi

mysql - 使用 HAVING 子句从 MySQL View 中选择返回空结果集

转载 作者:可可西里 更新时间:2023-11-01 07:33:24 25 4
gpt4 key购买 nike

我和我的业务合作伙伴在从具有 HAVING 子句的 MySQL View 中进行选择时遇到问题。

查询只是从 View 中选择几个字段,通过一些计算动态确定距离,并将其命名为“距离”——然后将结果限制为距离小于提供的变量的那些行。

距离是使用谷歌地图引用的 Haversine 公式计算的: https://developers.google.com/maps/articles/phpsqlsearch

这是我所知道的:

1) 当从查询中移除 HAVING 子句时,它成功返回 View 中的所有结果,包括为每一行计算的“距离”

2)在查询中加入HAVING子句,返回空结果集

3) 我们还尝试将 HAVING 子句中的变量交换为静态数字——这也返回了一个空结果集

View 的内容似乎无关紧要,因为没有 HAVING 子句一切正常。

查询如下:

SELECT 
restaurantName,
restaurantID,
locationID,
locationCity,
locationState,
locationAddress,
locationLatitude,
locationLongitude,
( 3959 * acos( cos( radians('%s') ) * cos( radians( locationLatitude ) ) * cos( radians( locationLongitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( locationLatitude ) ) ) ) AS distance
FROM newView
HAVING distance < '%s'
ORDER BY distance

请记住, View 在没有 HAVING 子句的情况下完美地计算了每个选定行的“距离”,因此我们确信问题出在此处......当我们将其取出时,一切正常,但返回 View 中的每一行。

知道为什么 HAVING 子句返回一个空集吗? HAVING 子句是否与 View 不兼容?

最佳答案

当您使用 GROUP BY 子句将行分组在一起时,HAVING 子句旨在用于聚合数据。由于您单独对每一行进行操作,因此您应该将 HAVING 替换为 WHERE 子句。参见 this example了解详情。

在 SELECT 列表中的非聚合列上使用 HAVING 是 MySQL 支持的非标准行为,但不应依赖该行为。即使是 MySQL reference阻止它:

Do not use HAVING for items that should be in the WHERE clause. For example, do not write the following:

SELECT col_name FROM tbl_name HAVING col_name > 0;

Write this instead:

SELECT col_name FROM tbl_name WHERE col_name > 0;

顺便说一句:如果您要将参数从用户传递到您的查询(使用 %s),请确保查看准备好的语句。否则,您手上可能存在明显的安全漏洞。

关于mysql - 使用 HAVING 子句从 MySQL View 中选择返回空结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9730873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com