gpt4 book ai didi

mysql - 从用户的 friend 那里检索帖子,每个 friend 只有一行

转载 作者:行者123 更新时间:2023-11-29 02:32:35 24 4
gpt4 key购买 nike

我有这 3 个表:

POST (id, name, id_user, ..)
FRIENDS (id, followerid, followingid, acepted) /* acepted must be 1 to users be considered friends */

好的,所以我想从用户 5 那里获取所有 friend 的帖子。但是我在构建查询时遇到了很多麻烦。我知道我需要加入,问题是当前用户(ID 为 5)可能是 followerid 或 followingid,所以我怎么知道?

我正在尝试类似的东西(但被废话阻止了):

SELECT posts.*,friends.id 
FROM friends LEFT JOIN ON (friends.followerid = posts.id) OR (friends.following.id = posts.id)

但我真的不知道 ON 是否在内部接受 OR,我可以在这里得到一些提示吗?谢谢!

最佳答案

ON子句类似于 WHERE这两个子句都接受一个(简单或复杂的)条件,这是一个 bool 表达式。 OR operator 是一个boolean 运算符,因此它可以用在ON 中。和WHERE一样好, 所以请随意使用 OR在连接条件中使用任何您喜欢的方式来构建满足您要求的连接条件。

我认为您的查询基本上是在正确的轨道上。我只想指出一些您可能会遗漏的事情,这仅仅是因为您当时可能正专注于其他事情。

一件事是连接的类型。我期待你的 friends表应该包含各种用户之间的所有现有链接,而不仅仅是用户之间的链接 5和其他人。因此,如果您加入 friendsposts使用 left 连接(这是一个外部连接),您将获得来自 friends所有链接。 ,不仅是用户 5的,这可能不是您想要的。当然,您可以添加 WHERE条件类似于 friends.id IS NOT NULL 的子句,但这本质上等同于内部连接没有那个条件。因此,改用内部联接。

然而,你的WHERE friends.acepted = 1 需要子句可能条件,当然,因为您只希望用户 5 的 friend 参与,我假设您的意思是那些确认成为 friend 的人,因此 acepted应该是 1 .

当然,用户必须有一个条件5某处也是。在我看来,如果您从 friends 派生一个表,那将是最简单的那将代表用户5 的 friend ,并且它们也作为一个列。 (也就是说,两个过滤器都将应用于派生表,而不是应用于连接的结果集。)这样,将 friend 加入 posts 会更容易。表,因为您的连接条件会更简单。以下是您如何导出此类表格的一种方法:

SELECT
id,
CASE followerid WHEN 5 THEN followingid ELSE followerid END AS friend_id
FROM friends
WHERE acepted = 1
AND (followerid = 5 OR followingid = 5)

即,此查询检索作为用户 acepted = 1 的好友 ( 5 ) 的用户 ID (followerid = 5 OR followingid = 5)。单个用户 ID 列,friend_id , 由 followerid 组成或 followingid : 如果一个是 5 ,另一个被拉动,反之亦然。

这就是您如何在最终查询中使用此派生表:

SELECT
p.*,
f.id /* there's an `id` column in `posts`, so it might be a good idea
to assign `friends.id` a distinct alias, like `friends_id` */
FROM (
SELECT
id,
CASE followerid WHEN 5 THEN followingid ELSE followerid END AS friend_id
FROM friends
WHERE acepted = 1
AND (followerid = 5 OR followingid = 5)
) AS f
INNER JOIN posts AS p ON p.id_user = f.friend_id

关于mysql - 从用户的 friend 那里检索帖子,每个 friend 只有一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10859249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com