Quest
查询选择以“Vancouver”开头且距离以“Vancouver”开头的所有位置的中心 5 分钟范围内的所有点。例如,Vancouver South Fraser、Vancouver Fairview 和Vancouver Ballantree Place W 的纬度和经度与其平均纬度和经度相差不超过 5 分钟。纬度和经度存储为 (4915, 12311) 整数对(即 49.15'N 和 123.11'W)。
SQL Code
下面的令人厌恶的 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
Question
如何在不使用视图的情况下简化此查询以消除冗余?
限制
数据库是 MySQL,但 ANSI SQL 总是不错的。
谢谢你!
select
name
from
(select
round((min(LATITUDE) + max(LATITUDE)) / 2) as LATITUDE,
round((min(LONGITUDE) + max(LONGITUDE)) / 2) as LONGITUDE
from STATION
where DISTRICT_ID = '110'
AND NAME LIKE 'Vancouver%') AS center
inner join STATION s
where
s.DISTRICT_ID = '110'
and s.NAME like 'Vancouver%'
and s.LATITUDE between center.LATITUDE - 5 and center.LATITUDE + 5
and s.LONGITUDE between center.LONGITUDE - 5 and center.LONGITUDE + 5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)