2015-08-15 91 views
2

我有这样的数据集:计数2列

id uid follows_uid status  
1 1  2   ACTIVE 
2 1  3   ACTIVE 
3 3  1   ACTIVE 
4 4  1   ACTIVE 
5 2  1   ACTIVE 

上给予uid我要计算有多少用户在下面,多少后跟(给定用户)。

结果集将是:

following  followers 
2    3 

这里是做工作的查询:

SELECT COUNT(*) as following, 
    (SELECT COUNT(*) FROM user_followers where follows_uid = 1 ) as followers 
FROM user_followers 
WHERE uid = 1 and `status` = 'ACTIVE' 

现在的问题是,In't有任何其他方式来完成这件事?或者它是实现这一目标的最佳方式?

回答

2

如果您对uidfollows_uid单独的索引,那么我相信像你一样使用子查询是最快的方法来检索单独计数,因为每个查询将采取指数的优势,检索伯爵。

+0

我的查询和这个有什么区别?请用优化角度解释 – Shaharyar

+0

@Shaharyar抱歉,没有注意到它们是相同的。我相信使用子查询是最快的方法,如果适当的列索引,因为然后每个计数可以利用索引然后 – FuzzyTree

+0

谢谢,您的意见是合理的所有答案。现在你会怎么说@davmos的回答?它是否比实际查询更优化? – Shaharyar

1

这是实现它的另一种方法。

select following.*, followers.* from 
(select count(uid) from user_followers where uid = 1) following, 
(select count(follows_uid) from user_followers where follows_uid = 1) followers; 

而且,要回答你的问题,你的子查询方法实际上是实现它的最好方法。正如@FuzzyTree指出的,你可以使用索引来优化你的性能。

1
SELECT 
    IFNULL(SUM(IF(uid = 1, 1, 0)), 0) as following, 
    IFNULL(SUM(IF(follows_uid = 1, 1, 0)), 0) as followers 
FROM user_followers 
WHERE (uid = 1 OR follows_uid = 1) 
AND `status` = 'ACTIVE'; 

Click here to see SQL Fiddle

+0

@FuzzyTree。 。 。没有'group by'的聚合查询总是返回一行,即使没有行匹配。 –

+1

@GordonLinoff我站在纠正,但是,如果一个uid不在表中,因为查询被写入它将返回null,而不是0,0 – FuzzyTree

+0

谢谢@GordonLinoff – davmos