加入两个表子查询

时间:2017-12-18 18:48:58

标签: mysql sql

我试图从用户位置在给定半径范围内的*表中获取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

Here's a screenshot of the table state

因此,用户89,90和91基本上属于位置半径,但不会包含在结果中,因为用户88已经喜欢它们。

2 个答案:

答案 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;