SQL语法错误 - Haversine公式

4
我正在尝试使用 Haversine 公式从 WordPress 数据库中获取最近的地点(链接1)

我的表结构如下所示:

posts

+--------------+
| Field        |
+--------------+
| ID           |
| post_author  |
| post_title   | 
| post_type    | 
+--------------+

文章元数据

+--------------+
| Field        |
+--------------+
| meta_id      |
| post_id      |
| meta_key     |
| meta_value   |
+--------------+

并且具有 meta_key 值为 latitudelongitude 的记录。

查看 我之前问题的答案,了解我使用的 SQL 语句来获取纬度和经度。

SELECT p.ID, 
  p.post_title, 
  p.post_author,
  max(case when pm.meta_key='latitude' then pm.meta_value end) latitude,
  max(case when pm.meta_key='longitude' then pm.meta_value end) longitude
FROM `wp_posts` p
LEFT JOIN `wp_postmeta` pm
  on p.ID=pm.post_id 
WHERE p.post_type='place' 
  AND (pm.meta_key='latitude' OR pm.meta_key='longitude') 
GROUP BY p.ID, p.post_title, p.post_author
ORDER BY p.ID ASC

现在我想将上述查询整合到此问题的答案中。
SELECT item1, item2, 
    ( 3959 * acos( cos( radians(37) ) 
                   * cos( radians( lat ) ) 
                   * cos( radians( lng ) 
                       - radians(-122) ) 
                   + sin( radians(37) ) 
                   * sin( radians( lat ) ) 
                 )
   ) AS distance 
FROM geocodeTable 
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;

以下是通过组合查询得到的结果。
SELECT ID, 
  post_title, 
  post_author,
  max(case when meta_key='latitude' then meta_value end) latitude,
  max(case when meta_key='longitude' then meta_value end) longitude,
  ( 3959 * acos( cos( radians(18.204540500000) ) 
                   * cos( radians( latitude ) ) 
                   * cos( radians( longitude ) 
                       - radians(-66.450958500000) ) 
                   + sin( radians(18.204540500000 ) 
                   * sin( radians( latitude ) ) 
                 )
   ) AS distance 
FROM `wp_posts` 
LEFT JOIN `wp_postmeta` 
  on ID=post_id 
WHERE post_type='place' 
  AND (meta_key='latitude' OR meta_key='longitude') 
GROUP BY ID, post_title, post_author
ORDER BY ID ASC

但这会产生语法错误。
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS distance FROM `wp_posts` LEFT JOIN `wp_postmeta` on ID=post_id WHERE po' at line 13
2个回答

4
您的第一个 sin() 函数缺少一个闭合的 )
( 3959 * acos( cos( radians(18.204540500000) ) 
                   * cos( radians( latitude ) ) 
                   * cos( radians( longitude ) 
                       - radians(-66.450958500000) ) 
                   + sin( radians(18.204540500000 ) ) /* <--- here */
                   * sin( radians( latitude ) ) 
              )
 ) AS distance 

虽然这个错误不容易从视觉上察觉,但是将您的代码复制到支持括号匹配的文本编辑器中可以发现它。强烈建议使用一个这样的编辑器来进行查询的开发和测试,如果不是为了开发和测试,至少也要为了调试。


我曾经使用MySQL Workbench,但它没有括号匹配功能 :-( - Mithun Sreedharan
@mithun,这个查询是否为您提供了结果? - user4281203

0

试试这个:

SELECT *, ( 3959 * ACOS( COS( RADIANS(18.204540500000) ) 
                   * COS( RADIANS( latitude ) ) 
                   * COS( RADIANS( longitude ) 
                       - RADIANS(-66.450958500000) ) 
                   + SIN( RADIANS(18.204540500000 ) )
                   * SIN( RADIANS( latitude ) ) 
                 )
   ) AS distance  
FROM 
(SELECT ID, 
  post_title, 
  post_author,
  MAX(CASE WHEN meta_key='geo_latitude' THEN meta_value END) latitude,
  MAX(CASE WHEN meta_key='geo_longitude' THEN meta_value END) longitude
FROM `wp_posts` 
LEFT JOIN `wp_postmeta` 
  ON ID=post_id 
WHERE post_type='place' 
  AND (meta_key='geo_latitude' OR meta_key='geo_longitude') 
GROUP BY ID, post_title, post_author
ORDER BY ID ASC) AS A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接