首页 > 解决方案 > 如何从多个表的坐标查询计算距离?

问题描述

我的应用程序需要搜索用户照片在其他表中的附近用户。下面是我的查询,但它会产生语法错误。

TABLE 1 (students)
student_id | name |  latitude  | longitude
----------------------------------------
1          | A    | 34.xxxxxx  | -118.xxxxxx
2          | B    | 34.xxxxxx  | -118.xxxxxx
3          | C    | 34.xxxxxx  | -118.xxxxxx


TABLE 2 (photos)
photo_id   | student_id | photo             | main 
---------------------------------------------------
1          | 1          | apple.jpg         |   1
2          | 1          | orange.jpg        |   0 
3          | 2          | cantaloupe.jpg    |   1
4          | 1          | lemon.jpg         |   0


SET @lat = 34.080318;
SET @lng = -118.239095;
SELECT s.student_id,s.name,s.latitude,s.longitude,p.photo,
    (   ACOS( COS( RADIANS( @lat  ) ) 
            * COS( RADIANS( s.latitude ) )
            * COS( RADIANS( s.longitude ) - RADIANS( @lng ) )
            + SIN( RADIANS( @lat  ) )
            * SIN( RADIANS( s.latitude ) )
        )
    * 3959
    ) AS distance
    FROM students s INNER JOIN photos p ON s.student_id = p.student_id
    HAVING distance < 10
    WHERE p.main=1 AND s.student_id=1
    ORDER BY distance ASC;

标签: mysqlsql

解决方案


WHERE和的HAVING顺序错误:

SELECT s.student_id,s.name,s.latitude,s.longitude,p.photo,
    (   ACOS( COS( RADIANS( @lat  ) ) 
            * COS( RADIANS( s.latitude ) )
            * COS( RADIANS( s.longitude ) - RADIANS( @lng ) )
            + SIN( RADIANS( @lat  ) )
            * SIN( RADIANS( s.latitude ) )
        )
    * 3959
    ) AS distance
    FROM students s INNER JOIN photos p ON s.student_id = p.student_id
    WHERE p.main=1 AND s.student_id=1
    HAVING distance < 10
    ORDER BY distance ASC;

顺便说一句,这使用了关于该HAVING子句的 MySQL 扩展。在大多数数据库中,您将使用子查询。


推荐阅读