从数据库表中获取相互关系

Posted

技术标签:

【中文标题】从数据库表中获取相互关系【英文标题】:Get mutual relationship from database table 【发布时间】:2021-12-30 18:36:20 【问题描述】:

我有表 user_follow,它只有两列:whowhom。当 WHO 遵循 WHOM 时,它们代表用户之间的联系。如果两个用户互相关注,他们被视为朋友。在这种情况下,表将包含记录:

WHO   WHOM
1     2
2     1

其中 1 和 2 只是用户 ID。

为了确定两个用户是否是朋友,我必须查询表并使用简单条件

SELECT COUNT(*) 
FROM user_follow 
WHERE (who = 1 AND whom = 2) OR (who = 2 AND whom = 1)

如果我得到2,那么他们就是朋友。

但是如果我想加载所有用户朋友的列表,我不能这样做。所以我想出了 sql join 自己:

SELECT uf2.whom 
FROM user_follow AS uf1 
LEFT JOIN user_follow AS uf2 ON uf1.who = uf2.whom 
WHERE uf1.whom = ? AND uf2.who = ? ORDER BY uf2.whom

我做了一个虚拟表来测试它,它可以工作。但我希望有人确认这是正确的解决方案。

【问题讨论】:

【参考方案1】:

如果您为? 提供相同的参数值,我认为您的查询是正确的。我发现下面的查询更容易理解。

下面的查询列出了一个用户的好友(互相关注的用户):

SELECT uf1.whom
FROM user_follow AS uf1
INNER JOIN user_follow AS uf2
    -- filter down to followed users
    ON uf1.whom = uf2.who
    -- followed users follow their followers
    AND uf1.who = uf2.whom
-- the user whose friends are listed
WHERE uf1.who = ?
ORDER BY 1
;

【讨论】:

以上是关于从数据库表中获取相互关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 从关系表中获取数据

如何从 Prisma 中的 MySql 关系表中获取数据

如何通过模型关系从三个相关表中获取数据?

Laravel 雄辩模型如何从关系表中获取数据

Oracle查询从多维表中获取关系数据集结果

如何从雄辩关系中的第三个表中获取数据雄辩的多对多关系