首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择相互跟随者,不包括被阻塞的联系人

选择相互跟随者,不包括被阻塞的联系人
EN

Stack Overflow用户
提问于 2022-04-06 06:49:59
回答 1查看 156关注 0票数 2

用户表

代码语言:javascript
复制
id   activated 
---  ------------ 
1       1
2       1
3       0
4       1
5       1
6       1

跟随表

代码语言:javascript
复制
follower_id   following_id 
------------ --------------
    1               2
    2               1
    4               2
    5               1
    3               2
    5               2
    6               1
    3               4
    6               2
    3               1
    4               1

阻塞表

代码语言:javascript
复制
blocking_id   blocked_id 
------------ --------------
    2               4

假设我是id为2的用户

预期结果

代码语言:javascript
复制
   user_id      mutual_followers 
-------------  -----------------
      1               2
      5               0
      6               0

我想得到用户的共同追随者,并排除阻塞或阻塞和用户的激活是0。

我怎么才能一直用MySQL来完成它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-10 11:15:27

首先使用CTE返回用户的所有追随者,根据您的条件筛选为活动的和非阻塞的,然后为每个追随者获得他们的非阻塞追随者。

然后过滤追随者的追随者,以便只剩下相互的追随者(或没有)并聚合:

代码语言:javascript
复制
WITH cte AS (
  SELECT f.follower_id user_id
  FROM Follow f
  INNER JOIN Users u ON u.id = f.follower_id AND u.activated
  LEFT JOIN Blocking b ON b.blocking_id = f.following_id AND b.blocked_id = f.follower_id 
  WHERE f.following_id = 2 AND b.blocked_id IS NULL  
)
SELECT c1.user_id, 
       COUNT(c2.user_id) mutual_followers 
FROM cte c1 
LEFT JOIN Follow f ON f.following_id = c1.user_id
LEFT JOIN Blocking b ON b.blocking_id = f.following_id AND b.blocked_id = f.follower_id
LEFT JOIN cte c2 ON c2.user_id = f.follower_id
WHERE b.blocked_id IS NULL 
GROUP BY c1.user_id;

请参阅demo1demo2 (如果第一个无法访问或有时无法运行)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71762230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档