0

我正在尝试运行以找到最近的点和纬度。哪个工作正常是我在我的数据库中存储了单独的值,但是我有一个管道字符串,我可以用子字符串索引拆分它。但是,当我尝试在我的选择查询中组合这些功能时,我并没有得到任何快乐。

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 1), '|', -1) as 'lat',
SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 2), '|', -1) as 'lng',
title,
( 6371 * acos( cos( radians(51.527351) ) * cos( radians( 'lat') ) * cos( radians( 'lng' ) - radians(0.765544) ) + sin( radians(51.527351) ) * sin( radians( 'lat' ) ) ) ) AS distance 
FROM locations HAVING distance < 500
ORDER BY distance
LIMIT 0 , 20

任何人都可以解释一下吗?

4

2 回答 2

1

radians( 'lat')

在这部分查询中,'lat'是一个字符串,而不是列名或类似名称。当将该字符串传递给 时radians,它将被转换为一个数字,在这种情况下为零。因此,您将 0 转换为弧度。

您不能将一列用作计算另一列值的输入。您要么必须重复表达式,要么使用这样的子查询:

SELECT lat, lng, title,
  (6371 * acos(cos(radians(51.527351)) *
   cos(radians(lat)) * cos(radians(lng) - radians(0.765544)) +
   sin(radians(51.527351)) * sin(radians(lat)))
  ) AS distance
FROM
  (SELECT title,
     SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 1), '|', -1) + 0 as lat,
     SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 2), '|', -1) + 0 as lng
   FROM locations
  ) AS sub
HAVING distance < 500
ORDER BY distance
LIMIT 0 , 20
于 2012-10-04T12:29:31.597 回答
0

这是我重复查询的解决方案。我还没有机会测试不同解决方案的基准测试,但子查询解决方案更令人愉快

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 1), '|', -1) as 'latitude',
       SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 2), '|', -1) as 'longitude',
(
  3959 * acos(
    cos(radians({MYLAT})) * cos(radians(SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 1), '|', -1)))
    * cos(radians(SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 2), '|', -1))) - radians({MYLONG}) + sin(radians({MYLAT})) 
    * sin( radians(SUBSTRING_INDEX(SUBSTRING_INDEX(longlat, '|', 1), '|', -1)))
  )
)
AS distance,
title

FROM locations
ORDER BY distance
LIMIT 0 , 20

原来我现在到处都在使用这个等式,很高兴能把它搞定:)

我使用平均 3959 作为地球的半径,但是我想知道对于不同的全球位置使用某种区域纬度是否会更好。

于 2012-10-08T14:19:34.313 回答