Mysql 如何使sql更高效。只需要数一数

Mysql 如何使sql更高效。只需要数一数,mysql,sql,postgresql,Mysql,Sql,Postgresql,我需要找到用户数: 谁有一个或多个粉丝 谁有两个粉丝 谁有三个粉丝 下面是我开发的sql,用于获得1的答案 SELECT users.id, count(fans.id) FROM users JOIN fans on users.id = fans.user_id GROUP BY users.id HAVING COUNT(fans.id) > 0 上面的查询是有效的,但我要获取所有用户记录,然后计算数组的大小。当用户数达到数千时,它的性能非常糟糕。如何重构

我需要找到用户数:

谁有一个或多个粉丝 谁有两个粉丝 谁有三个粉丝 下面是我开发的sql,用于获得1的答案

  SELECT users.id, count(fans.id)
    FROM users 
    JOIN fans on users.id = fans.user_id
GROUP BY users.id
  HAVING COUNT(fans.id) > 0
上面的查询是有效的,但我要获取所有用户记录,然后计算数组的大小。当用户数达到数千时,它的性能非常糟糕。如何重构查询,以便只获得用户数

我正在使用mysql,但我可能需要另一个使用postgresql的项目。

试试这个:

select usersWithOneOrMoreFans = sum( case when t.fan_count >= 1 then 1 else 0 end ) ,
       usersWithTwoFans       = sum( case when t.fan_count =  2 then 1 else 0 end ) ,
       usersWithThreeFans     = sum( case when t.fan_count =  3 then 1 else 0 end )
from ( select user_id as user_id   ,
              count(*) as fan_count ,
       from fans
       group by fans.user_id
     ) t
[编辑以删除无意义的表引用]

尝试以下操作:

select usersWithOneOrMoreFans = sum( case when t.fan_count >= 1 then 1 else 0 end ) ,
       usersWithTwoFans       = sum( case when t.fan_count =  2 then 1 else 0 end ) ,
       usersWithThreeFans     = sum( case when t.fan_count =  3 then 1 else 0 end )
from ( select user_id as user_id   ,
              count(*) as fan_count ,
       from fans
       group by fans.user_id
     ) t

[编辑以删除无意义的表引用]

子查询将很好地完成

Select 
  Count(user.id) 
from 
  Users 
Where 
  (Select Count(fans.id) from Fans where user_id = users.id) > 0

子查询会很好地完成

Select 
  Count(user.id) 
from 
  Users 
Where 
  (Select Count(fans.id) from Fans where user_id = users.id) > 0
这是我的:

 SELECT nfans, count(*) AS nusers FROM
     (SELECT count(fans.id) AS nfans FROM fans GROUP BY user_id) foo
 GROUP BY nfans
这将为您提供拥有nfans粉丝的用户数量

如果要将输出剪辑到最多3个风扇:

 SELECT nfans, count(*) AS nusers FROM
     (SELECT least(3,count(fans.id)) AS nfans FROM fans GROUP BY user_id) foo
 GROUP BY nfans
在这种情况下,bin nfans=3包含拥有3个或更多粉丝的用户数。

这是我的:

 SELECT nfans, count(*) AS nusers FROM
     (SELECT count(fans.id) AS nfans FROM fans GROUP BY user_id) foo
 GROUP BY nfans
这将为您提供拥有nfans粉丝的用户数量

如果要将输出剪辑到最多3个风扇:

 SELECT nfans, count(*) AS nusers FROM
     (SELECT least(3,count(fans.id)) AS nfans FROM fans GROUP BY user_id) foo
 GROUP BY nfans

在本例中,bin nfans=3包含拥有3个或更多粉丝的用户数。

这就像魅力一样。非常感谢。今天也学到了一些新的东西。我认为@Nicholas Carey answer的开销更小,并且给出了你所要求的三个选项。既然你觉得上面的方法还可以,你可以试着从Fans那里选择COUNTDISTINCT user.id,效果很好。非常感谢。今天也学到了一些新的东西。我认为@Nicholas Carey answer的开销更小,并且给出了你所要求的三个选项。由于您认为上面的选项没有问题,您可以尝试从Fanswow中选择COUNTDISTINCT user.id。我不知道有人能像真正的编程语言一样用sql编写代码。我希望我能和你分开这一点。SQL是一种真正的编程语言,图灵完全。这不是一种程序语言。这都是关于集合操纵的。这并不是说SQL适合于一般用途的工作:它是为特定的问题空间设计的。我不知道有人能像真正的编程语言一样用sql编写代码。我希望我能和你分开这一点。SQL是一种真正的编程语言,图灵完全。这不是一种程序语言。这都是关于集合操纵的。这并不是说SQL适合于一般用途的工作:它是为特定的问题空间设计的。您需要的所有信息不是都在表中吗?我根本看不到加入用户表的理由。如果只有数千行存在性能问题,请确保统计信息是最新的,并查看查询的执行计划。您需要的所有信息不都在表中吗?我根本看不到加入用户表的理由。如果只有数千行存在性能问题,请确保统计信息是最新的,并查看查询的执行计划。