我有一个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已经看到并喜欢该用户。
答案 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