MySQL计算距离(简单解决方案)

时间:2011-10-10 21:16:22

标签: mysql select

我有下一个查询,用于获取给定距离内的地址和邮政编码。根据经度和纬度数据计算距离。

在这个例子中,我已将用户输入替换为仅值(lat = 52.64,long = 6.88 en desired distance = 10km)

查询:

SELECT *,
ROUND( SQRT( POW( ( (69.1/1.61) * ('52.64' - latitude)), 2) + POW(( (53/1.61) * ('6.88' - longitude)), 2)), 1) AS distance
FROM lp_relations_addresses distance
WHERE distance < 10
 ORDER BY `distance`  DESC

将未知列距作为错误消息。 当我离开where clausule时,我得到了表的每个记录,包括他们计算的距离。在这种情况下,我必须获取整个表。

我如何只获取所需的记录?

提前感谢任何评论!

3 个答案:

答案 0 :(得分:5)

您不能从sql语句的另一部分引用select子句中的别名。您需要将整个表达式放在where子句中:

WHERE
    ROUND( SQRT( POW( ( (69.1/1.61) * ('52.64' - latitude)), 2)
        + POW(( (53/1.61) * ('6.88' - longitude)), 2)), 1) < 10

更清洁的解决方案是使用子查询生成计算数据:

  SELECT *, distance
    FROM (
       SELECT *,
           ROUND( SQRT( POW( ( (69.1/1.61) * ('52.64' - latitude)), 2)
               + POW(( (53/1.61) * ('6.88' - longitude)), 2)), 1) AS distance
           FROM lp_relations_addresses
       ) d
   WHERE d.distance < 10
ORDER BY d.distance DESC

演示:http://www.sqlize.com/q96p2mCwnJ

答案 1 :(得分:3)

作为mellamokb notes,您无法在WHERE子句中引用列别名。 You can, however, do it in a HAVING clause

SELECT *,
  ROUND( SQRT( POW( ( (69.1/1.61) * ('52.64' - latitude)), 2) +
         POW(( (53/1.61) * ('6.88' - longitude)), 2)), 1) AS distance
FROM lp_relations_addresses
HAVING distance < 10
ORDER BY distance DESC

聚苯乙烯。如果您有很多地址,您可能需要考虑通过尽早排除其中一些来优化查询。例如,使用合适的索引,以下版本可能会快得多:

SELECT *,
  ROUND( SQRT( POW( ( (69.1/1.61) * ('52.64' - latitude)), 2) +
         POW(( (53/1.61) * ('6.88' - longitude)), 2)), 1) AS distance
FROM lp_relations_addresses
WHERE latitude > '52.64' - 10 / (69.1/1.61)
  AND latitude < '52.64' + 10 / (69.1/1.61)
  AND longitude > '6.88' - 10 / (53/1.61)
  AND longitude < '6.88' + 10 / (53/1.61)
HAVING distance < 10
ORDER BY distance DESC

答案 2 :(得分:2)

您将计算别名为'distance',但您也将表'lp_relations_addresses'别名为'distance'。尝试给他们一个不同的名字:

SELECT *,
ROUND( SQRT( POW( ( (69.1/1.61) * ('52.64' - latitude)), 2) + POW(( (53/1.61) * ('6.88' - longitude)), 2)), 1) AS distance
FROM lp_relations_addresses addr
WHERE distance < 10
ORDER BY `distance`  DESC