我在使用MySQL执行基于邮政编码,经度和文件的区域搜索时遇到“问题”。但是在一个国家/地区内存在重复的邮政编码。
我正在执行第一个查询,检查多个结果并选择第一个结果(因为它们的距离差异非常小)。但我想在一个查询中做到这一点。
有没有办法,在使用WHERE时忽略多个匹配或只是选择第一个。
这是我到目前为止所做的:
SELECT
u.name,
dest.zc_zip,
dest.zc_location_name,
ACOS(
SIN(RADIANS(src.zc_lat)) * SIN(RADIANS(dest.zc_lat))
+ COS(RADIANS(src.zc_lat)) * COS(RADIANS(dest.zc_lat))
* COS(RADIANS(src.zc_lon) - RADIANS(dest.zc_lon))
) * 6380 AS distance
FROM zip_coordinates dest
CROSS JOIN zip_coordinates src
CROSS JOIN users u
WHERE src.zc_id = 2 /* searching for id */
AND u.zip = dest.zc_zip
AND u.city = dest.zc_location_name
HAVING distance < 100
ORDER BY distance;
我希望将src.zc_id = 2
更改为src.zc_zip = XXXX
修改
我还创建了一个sql小提琴:http://sqlfiddle.com/#!2/5fb6a/3
答案 0 :(得分:1)
如果我理解你的问题,你想要替换
WHERE src.zc_id = 2 /* searching for id */
与以下内容相符:
WHERE src.zc_id = (SELECT ... FROM zip_coordinates where ...)
并且您希望WHERE子句的结果是单个值。在这种情况下,您可以使用MAX功能。类似的东西:
WHERE src.zc_id = (SELECT MAX(zc_id) FROM zip_coordinates where ...)
如果您在此SELECT查询之前提供有关正在运行的查询的更多信息以选择其中一个结果,将会很有帮助。