我试图从用户位置在给定半径范围内的*
表中获取users2
。
位置查询在user_location2
表上正常工作。
SELECT uid, ( 3959 * acos( cos( radians(28.247800068217) ) * cos( radians( `lat` ) ) * cos( radians( `lon` ) - radians(-80.726205977101) )
+ sin( radians(28.247800068217) ) * sin( radians( `lat` ) ) ) )
AS distance FROM user_location2
HAVING distance <= 25 ORDER BY time_stamp
并且内连接在没有位置子查询
的情况下工作正常SELECT *
FROM users2
LEFT JOIN user_location2
ON user_location2.uid = users2.id
我在组合这两者时遇到了麻烦。这是我当前的查询,只是返回所有行,所以我显然做错了。
SELECT *
FROM users2
LEFT JOIN user_location2
ON user_location2.uid = users2.id
WHERE EXISTS (SELECT NULL, ( 3959 * acos( cos( radians(26.247800068217) ) * cos( radians( `lat` ) ) * cos( radians( `lon` ) - radians(-89.726205977101) ) + sin( radians(26.247800068217) ) * sin( radians( `lat` ) ) ) )
AS distance FROM user_location2
HAVING distance <= 5 ORDER BY time_stamp)
包含编辑
我希望添加第3个表(user_like)以消除许多可能不包含在结果中的行。
让我们说脚本正在运行user_id = 88
因此,用户89,90和91基本上属于位置半径,但不会包含在结果中,因为用户88已经喜欢它们。
答案 0 :(得分:0)
试试这个......
SELECT users2.*
FROM users2
LEFT JOIN user_location2
ON user_location2.uid = users2.id
WHERE ( 3959 * acos( cos( radians(28.247800068217) ) * cos( radians( `lat` ) ) * cos( radians( `lon` ) - radians(-80.726205977101) )
+ sin( radians(28.247800068217) ) * sin( radians( `lat` ) ) ) ) < = 5
ORDER BY time_stamp
两个表之间的连接很好。计算列已添加到select子句和where子句中,因为过滤器需要它。将它放在一个视图中会更容易,这样如果你需要更改它,它可以在一个地方完成。
编辑:从SELECT中删除了计算,因为我相信你不需要看到它。只需将其保留在WHERE子句中,因为它需要进行过滤。
答案 1 :(得分:0)
你可以试试这个:
SELECT *
FROM users2 A
LEFT JOIN user_location2 B
ON B.uid = A.id
WHERE ( 3959 * acos( cos( radians(26.247800068217) ) * cos( radians( `B.lat` ) ) * cos( radians( `B.lon` ) - radians(-89.726205977101) ) + sin( radians(26.247800068217) ) * sin( radians( `B.lat` ) ) ) ) > 25;