[英]SQL design in Follower/Followed model for relational databases and Follow Back functionality
假设我想在一个有两个字段的简单表中保留谁跟随谁;
UserId 和 FollowedId 以及我有一个简单的数据集;
用户身份 | 关注ID |
---|---|
1个 | 100 |
2个 | 100 |
3个 | 100 |
4个 | 100 |
5个 | 100 |
6个 | 100 |
100 | 5个 |
100 | 2个 |
当我想列出 ID 为 100 的用户的所有关注者时,我只使用SELECT*FROM Followers WHERE FollowedId = 100
100。
但是,当我查询时,我希望在我的关注者列表中包含以下信息;
在跟随我的人中我跟随谁。
我不直接想要我跟谁跟谁跟路口一样。
当我查询 ID 为 100 的用户的关注者列表时,我希望结果如下所示;
用户身份 | 关注ID | DoIFollowBack |
---|---|---|
1个 | 100 | 错误的 |
2个 | 100 | 真的 |
3个 | 100 | 错误的 |
4个 | 100 | 错误的 |
5个 | 100 | 真的 |
6个 | 100 | 错误的 |
我可以使用另一个查询来做到这一点,但只是想问问最有效的方法吗?
有另一列来保持这种双向关系吗? 获取关注者列表后,再进行一次查询,看看我关注了其中的哪些人?
您可以在 CTE 中使用相交来获取用户 ID,然后为第三列使用案例表达式:
with follow_back as (
select userid, followedid
from my_data
where followedid = 100
intersect
select followedid, userid
from my_data)
select userid, followedid,
case
when userid in (select userid from follow_back) then 'true' else 'false' end DoIFollowBack
from my_data
where followedid = 100
Output:
| userid | followedid | DoIFollowBack|
| ------ | ---------- | ------------ |
| 1 | 100 | false |
| 2 | 100 | true |
| 3 | 100 | false |
| 4 | 100 | false |
| 5 | 100 | true |
| 6 | 100 | false |
我相信您可以通过使用左外连接的自连接并评估连接条件的成功来完成此操作:
SELECT
f1.*, f2 is not null as DoIFollowBack
FROM
Followers f1
left join Followers f2 on
f2.FollowedId = f1.UserId and
f1.FollowedId = f2.UserId
WHERE
f1.FollowedId = 100
如果您将其扩展到更多(甚至所有)用户,这应该可以很好地扩展。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.