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

时间:2011-08-10 23:28:12

标签: 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个场地。

到目前为止的查询

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

按名称使用group不起作用,因为它会计算距离不会落入范围内。换句话说,如果有一个距离超过700米的工商银行有较低的身份证,那么即使两个工商银行有700米,工行也不会出现在结果中。所以我怀疑这是因为group by发生在having之前 或者可能有不同的解决方案?

我无法将距离检查移动到哪里,因为它不是真正的列#1054 - Unknown column 'distance' in 'where clause'

3 个答案:

答案 0 :(得分:1)

选择整个查询作为表,然后执行分组依据。

E.g。

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

答案 1 :(得分:0)

我不确定这是不是您正在寻找的,只是让一家银行距离最短。

SELECT banks.name, banks.id, banks_with_least_distance.distance
FROM banks JOIN
(
  SELECT name, min(
  GLength( LineStringFromWKB( LineString( `lnglat` , POINT( 121.437478728836, 31.182877821277 ) ) ) )
  *95000) AS `distance`
  FROM `banks` 
  WHERE (lnglat != "") AND (published =1) AND (GLength( LineStringFromWKB( LineString( `lnglat` , POINT( 121.437478728836, 31.182877821277 ) ) ) ) *95000 < 700)
  GROUP BY `name`
) AS banks_with_least_distance ON banks.name = banks_with_least_distance.name
ORDER BY banks_with_least_distance.distance DESC

已编辑:将where子句中的distance更改为实际公式。

答案 2 :(得分:0)

您确定您的样本是否完整,因为没有GROUP BY条件?如果你想要700英里范围内的银行,那么把它放在WHERE条件下。如果您只想要报告1个银行,那么将其放入GROUP BY。您可能需要在Group By中重复Glenght而不是使用别名 - 取决于您的SQL版本。你没有从一个点获取一定距离的银行列表 - 你正在抓住有位置的银行并计算某个点的距离。您只需要计算距离为700的银行,如果银行重复,您只需要列出一次。

    SELECT name, id, (GLength( ...) AS [distance]
    FROM [banks] 
    WHERE [lnglat] != "" ... AND [distance] <700 
    Group By [name], [id], [distance] 
    ORDER BY [distance] ASC