【发布时间】:2011-02-16 06:10:24
【问题描述】:
任务
查询选择所有以“Vancouver”开头且距离以“Vancouver”开头的所有位置的中心 5 分钟范围内的点。例如,Vancouver South Fraser、Vancouver Fairview 和 Vancouver Ballantree Place W 的纬度和经度在其平均经纬度的 5 分钟内。纬度和经度存储为 (4915, 12311) 整数对(表示 49.15'N 和 123.11'W)。
SQL 代码
下面的 SQL 可恶做到了这一点:
SELECT
NAME
FROM
STATION
WHERE
DISTRICT_ID = '110'
AND NAME LIKE 'Vancouver%'
AND LATITUDE BETWEEN
(SELECT round((min(LATITUDE) + max(LATITUDE)) / 2)-5 FROM STATION WHERE DISTRICT_ID = '110' AND NAME LIKE 'Vancouver%')
and
(SELECT round((min(LATITUDE) + max(LATITUDE)) / 2)+5 FROM STATION WHERE DISTRICT_ID = '110' AND NAME LIKE 'Vancouver%')
AND LONGITUDE BETWEEN
(SELECT round((min(LONGITUDE) + max(LONGITUDE)) / 2)-5 FROM STATION WHERE DISTRICT_ID = '110' AND NAME LIKE 'Vancouver%')
and
(SELECT round((min(LONGITUDE) + max(LONGITUDE)) / 2)+5 FROM STATION WHERE DISTRICT_ID = '110' AND NAME LIKE 'Vancouver%')
ORDER BY
LATITUDE
问题
如何在不使用视图的情况下简化此查询以消除冗余?
限制
数据库是 MySQL,但 ANSI SQL 总是很好。
谢谢!
【问题讨论】:
-
你能用简单的英语描述一下你想用这个查询来完成什么吗?
-
@nineside:更新了 SQL 的目的。
-
不是更准确的描述:选择所有以“Vancouver”开头且距离所有以“Vancouver”开头的位置中心 5 分钟半径范围内的点吗?
-
@eagle:你是对的。
-
您没有在半径范围内得到结果,因为您需要查看距离,即 sqrt(sqr(x2-x1)+sqr(y2-y1))。你得到的是矩形内的结果。