mysql - 如何确保 HAVING 发生在 GROUP BY 之前

标签 mysql group-by having

我正在抓取距某个点一定距离的银行列表

ICBC                        6805    119.86727673154
Bank of Shanghai            7693    372.999006839511
Bank of Ningbo              7626    379.19406334356
ICBC                        6790    399.580754911156
Minsheng Bank               8102    485.904900718796
Standard Chartered Bank     8205    551.038506011767
Guangdong Development Bank  8048    563.713291030103
Bank of Shanghai            7688    575.327270234431
Bank of Nanjing             7622    622.249663674778

但是我只想抢占每个链式店的 1 个 field 。

目前的查询

SELECT name, id , (
GLength( LineStringFromWKB( LineString( `lnglat` , POINT( 121.437478728836, 31.182877821277 ) ) ) )
) *95000 AS `distance`
FROM `banks` 
WHERE (
lnglat != ""
)
AND (
published =1
)
HAVING (
distance <700
)
ORDER BY `distance` ASC

按名称分组是行不通的,因为它计算的距离不在范围内。换句话说,如果在 700 m 之外有一个 id 较低的 ICBC,那么即使在 700 m 以内有两个 ICBC,ICBC 也不会出现在结果中。所以我怀疑发生这种情况是因为 group by 发生在 having
之前 或者可能有不同的解决方案?

我无法将距离检查移动到 where,因为它不是真正的列 #1054 - 'where clause' 中的未知列 'distance'

最佳答案

将整个查询选择为一个表,然后对其进行分组。

例如

Select * FROM 
(SELECT name, id , (
GLength( LineStringFromWKB( LineString( `lnglat` , POINT( 121.437478728836, 31.182877821277 ) ) ) )
) *95000 AS `distance`
FROM `banks` 
WHERE (
lnglat != ""
)
AND (
published =1
)
HAVING (
distance <700
)
ORDER BY `distance` ASC) t
GROUP BY t.name

关于mysql - 如何确保 HAVING 发生在 GROUP BY 之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7019174/

相关文章:

sql - 带有 rownum 或 HAVING >= ALL 的 Oracle ORDER BY

mysql - 如何查询mysql以选择具有两列非唯一组合的行

mysql - 我应该在更新之前使用选择来减少回滚吗?

php - 如何使用声明了 require/include 的 php 文件中的变量

javascript - 无法发布表单 - ExpressJS

python - 从按另一列分组的元素返回列表列表

sql - 如何使用 SQL Server 覆盖 GROUP BY 中的空列值?

javascript - 按数组分组并在主数组中添加字段和子数组

mysql - 在这种情况下如何减少一个 SQL 查询

mysql - MySQL 可以返回 "max"行中的列吗?