繁体   English   中英

SQL 在 Follower/Followed 中设计 model 用于关系数据库和 Follow Back 功能

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM