用户表
id activated
--- ------------
1 1
2 1
3 0
4 1
5 1
6 1跟随表
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阻塞表
blocking_id blocked_id
------------ --------------
2 4假设我是id为2的用户
预期结果
user_id mutual_followers
------------- -----------------
1 2
5 0
6 0我想得到用户的共同追随者,并排除阻塞或阻塞和用户的激活是0。
我怎么才能一直用MySQL来完成它呢?
发布于 2022-04-10 11:15:27
首先使用CTE返回用户的所有追随者,根据您的条件筛选为活动的和非阻塞的,然后为每个追随者获得他们的非阻塞追随者。
然后过滤追随者的追随者,以便只剩下相互的追随者(或没有)并聚合:
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;https://stackoverflow.com/questions/71762230
复制相似问题