将第三个表添加到左连接

时间:2017-12-18 23:49:00

标签: mysql sql

我有一个mysql查询,可以在给定点的某个距离内获取用户

SELECT users2.*
FROM users2
LEFT JOIN user_location2 
ON user_location2.uid = users2.id 
WHERE ( 3959 * acos( cos( radians(28.547800068217) ) * cos( radians( `lat` ) ) * cos( radians( `lon` ) - radians(-82.726205977101) ) 
+ sin( radians(28.547800068217) ) * sin( radians( `lat` ) ) ) )  <= 25
AND
ORDER BY time_stamp

我希望在第3个表(user_like)中添加消除很多可能不包含在结果中的行。

假设脚本正在运行user_id = 88

[![这是表的状态] [1]] [1]

我在调用第三张表时遇到问题或完全包含它。

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

类似的东西:

WHERE user_like.uid1 = 88 AND user_like.uid2 != (89,90,91)

编辑:

这是3个表结构:

-users2

id int(11)

(其他列已被省略,因为它们在这种情况下与select *无关)

-user_location2

uid int(11)
lat double
lon double
time_stamp  bigint(20)

-user_like

uid1  int(11)
uid2  int(11)
time_stamp  bigint(20)

为了澄清一点,我让用户发送一个请求(假设用户88),该请求应该返回他们25英里范围内的所有用户(此部分当前有效)。我想要添加的是用于考虑user_like表的查询。如果用户88已经“喜欢”了另一个用户(uid1,uid2),则应该从查询结果中删除该用户,因为用户88已经看到并喜欢该用户。

2 个答案:

答案 0 :(得分:1)

我对此没有信心,因为我发现列名非常混乱,并且没有要检查的样本数据

SELECT users2.*
FROM users2
INNER JOIN user_location2 uloc ON users2.id <> uloc.uid
LEFT JOIN users_like ulike ON uloc.uid = ulike.uid1 and users2.id <> ulike.uid1 and users2.id <> uloc.uid2
WHERE users2.id = 88
AND (3959 * acos(cos(radians(28.547800068217)) 
            * cos(radians(uloc.lat)) 
            * cos(radians(uloc.lon) 
            - radians(- 82.726205977101)) 
            + sin(radians(28.547800068217)) 
            * sin(radians(uloc.lat)))) <= 25 
ORDER BY uloc.time_stamp 
## always reference with table aliases

答案 1 :(得分:0)

试试这个:

SELECT users2.*
FROM users2
LEFT JOIN user_location2 
ON user_location2.uid = users2.id 
LEFT JOIN users_like ul ON ul.uid1 = users2.id
WHERE ( 3959 * acos( cos( radians(28.547800068217) ) * cos( radians( `lat` ) ) * cos( radians( `lon` ) - radians(-82.726205977101) ) 
+ sin( radians(28.547800068217) ) * sin( radians( `lat` ) ) ) )  <= 25
AND users2 != ul.uid2
ORDER BY time_stamp