找到最受欢迎的"特定人的追随者。有人拥有的粉丝越多,越多 "流行"他们是。
我需要SQL查询来选择最受欢迎的特定人群。
我的表 - (粉丝)
id | person_id | follower_person_id
1 1 2
2 1 3
3 2 1
4 2 4
5 3 1
6 3 2
7 3 4
8 4 3
例如,person_id 1总共有2个关注者,person_id 2有2个关注者 关注者,person_id 3共有3个粉丝,person_id有4个粉丝 2粉丝。
因此,person_id 3是person_id 1最受欢迎的关注者, person_id 1是person_id 2最受欢迎的关注者,依此类推......
这是我的查询,但它不起作用......
SELECT follower_person_id FROM followers f where f.person_id = 1 group by f.follower_person_id having max(select count(*) from followers where person_id = f.follower_person_id)
答案 0 :(得分:3)
您可以使用以下查询来获取每个人的关注者数量:
SELECT person_id, COUNT(*) AS cnt
FROM followers
GROUP BY person_id
<强>输出:强>
person_id cnt
-------------
1 2
2 2
3 3
4 1
使用上述查询作为派生表,您可以获得每个人的追随者数量(听起来有点复杂!):
SELECT t1.person_id, t1.follower_person_id, t2.cnt
FROM followers AS t1
JOIN (
SELECT person_id, COUNT(*) AS cnt
FROM followers
GROUP BY person_id
) AS t2 ON t1.follower_person_id = t2.person_id
<强>输出:强>
person_id, follower_person_id, cnt
------------------------------------
1, 2, 2
1, 3, 3
2, 1, 2
2, 4, 1
3, 1, 2
3, 2, 2
3, 4, 1
4, 3, 3
由于您只是在寻找特定的人,因此您可以在上述查询中使用WHERE
子句:
SELECT t1.person_id, t1.follower_person_id, t2.cnt
FROM followers AS t1
JOIN (
SELECT person_id, COUNT(*) AS cnt
FROM followers
GROUP BY person_id
) AS t2 ON t1.follower_person_id = t2.person_id
WHERE t1.person_id = 1
ORDER BY t2.cnt DESC LIMIT 1
带有ORDER BY
的 LIMIT
会为您提供特定受访者所关注的最受欢迎的人。
<强>输出:强>
person_id, follower_person_id, cnt
-----------------------------------
1, 3, 3
注意:您可以使用变量推广第二个查询的输出,以获得每个人关注的最受欢迎的人(这是每组最大的问题)。
答案 1 :(得分:1)
SELECT person_id,COUNT(person_id) as followerCount FROM followers
GROUP BY person_id ORDER BY COUNT(person_id) DESC;
答案 2 :(得分:1)
如果一个人有一个平局,这将随意挑选一个最受欢迎的粉丝,但它确实给出了预期的结果。
SELECT
person_id,
(
SELECT
_f.follower_person_id
FROM
followers _f
WHERE
_f.person_id = f.person_id
GROUP BY
_f.follower_person_id
ORDER BY
COUNT( _f.follower_person_id ) DESC
LIMIT 1
)
FROM
followers f
GROUP BY
person_id
答案 3 :(得分:0)
您需要按人员ID进行操作,而不是按照关键字ID,应该使用follower_id计数。
SELECT person_id ,count(follower_person_id) FROM followers f group by f.person_id
having count(follower_person_id)=(select max(f_cnt ) from
(select count(follower_person_id) f_cnt from followers group by person_id))
如果有2个人的受欢迎程度相同,那么它将返回那些具有相同数量的2个人
答案 4 :(得分:0)
@Parth你能试试这个较小的版本,我认为这个小而且易于理解
With temp as
(
select a.id, a.person_id, count(b.follower_person_id) as follower from
TableName a
inner join TableName b on a.person_id=b.follower_person_id
Group by a.person_id
)
select top 1 * from temp order by follower_person_id desc