2015-08-15 52 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