【问题标题】:add 3rd table to left join将第三个表添加到左连接
【发布时间】:2018-06-01 08:45:08
【问题描述】:

我有一个 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

我希望添加第三个表 (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)

(其他列已被省略,因为在这种情况下它们不相关选择 *)

-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 已经看到并喜欢了该用户。

【问题讨论】:

  • 我不认为您显示的结果来自您的查询。您的 users2 表中的列是什么? user_like 表的内容是什么?什么定义了一个用户是否和其他用户一样?
  • 我上面贴的表是第三张表(user_like)。 users2 表由用户 ID 和基本信息(姓名、年龄、性别)等组成。我想从我们处理的原始查询的结果中消除(对于这种情况)用户 89、90 和 91。
  • 查询的图像有多大用处?答案:与数据图像一样有用。
  • 好的开始,谢谢。 DDL 和“样本数据”之间存在细微差别。当您调试任何查询时,您会做什么? (查看数据)。

标签: mysql sql


【解决方案1】:

试试这个:

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

【讨论】:

  • 看起来可行!我将不得不再进行一些测试,但我得到了我想要的结果。
  • 啊,我收回了。如果我删除 user_like 表中的所有行,它不会返回任何内容。此时它应该返回所有用户
  • 我已更改加入。立即尝试。
  • 就是这样!非常感谢,非常感谢您的帮助。
【解决方案2】:

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

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

【讨论】:

  • 谢谢。我刚刚用表格结构更新了我的答案,所以也许这可以帮助解决一些困惑。
  • time_stamp 也来自 user_location2 表
猜你喜欢
  • 1970-01-01
  • 2018-11-06
  • 2023-01-29
  • 1970-01-01
  • 2020-08-04
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
相关资源
最近更新 更多