选择最多"流行"特定人的追随者。有人拥有的粉丝越多,受欢迎的人越多#34;他们是

时间:2017-04-07 05:25:20

标签: mysql sql

  

找到最受欢迎的"特定人的追随者。有人拥有的粉丝越多,越多   "流行"他们是。

我需要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)

5 个答案:

答案 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

工作SQL Fiddle

答案 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