2016-09-30 33 views
0

以下mysql查詢將在每個用戶名後輸出一列用戶名和一系列5列,這些用戶名是5個計數的結果。將動態表的計數總和作爲列MYSQL

SELECT f.username, 
(SELECT COUNT(id) FROM sites s WHERE s.username = f.username) site_count, 
(SELECT COUNT(id) FROM banners b WHERE b.username = f.username) banner_count, 
(SELECT COUNT(id) FROM favorites fa WHERE fa.username = f.username) favorite_count, 
(SELECT COUNT(id) FROM social_posts so WHERE so.username = f.username) social_count, 
(SELECT COUNT(id) FROM stream_updates st WHERE st.username = f.username) stream_count 
FROM members f 
    WHERE f.username 
     IN (SELECT friend2 as username FROM list_friends WHERE friend1 = :user 
     AND friend2 <> :user) 
    OR f.username 
     IN (SELECT friend1 as username FROM list_friends WHERE friend2 = :user 
    AND friend1 <> :user) 
    OR f.username = :user 

輸出示例:

| username | site_count | banner_count | favorite_count | social_count | stream_count | 
+----------+------------+--------------+----------------+--------------+--------------+ 
| user1 |  7  |  12  |  3  |  5  |  11  | 
| user2 |  2  |  1  |  12  |  1  |  0  | 
| user3 |  5  |  7  |  4  |  9  |  25  | 

我所希望達到的結果是每一行的總和:

| username | site_count | banner_count | favorite_count | social_count | stream_count | 
+----------+------------+--------------+----------------+--------------+--------------+ 
|   | 14  |  20  |  19  |  15  |  36  | 

回答

0

我的解決辦法是使用用戶定義的變量有:=,這樣的變量將與每個總和進行更新。

有關詳細信息閱讀:http://dev.mysql.com/doc/refman/5.7/en/user-variables.html

更新查詢的結束結果如下:

SELECT f.username, 
@sites := SUM((SELECT COUNT(*) FROM sites s WHERE s.username = f.username)) AS site_count, 
@banner := SUM((SELECT COUNT(*) FROM banners b WHERE b.username = f.username)) AS banner_count, 
@favs := SUM((SELECT COUNT(*) FROM favorites fa WHERE fa.username = f.username)) AS favorite_count, 
@social := SUM((SELECT COUNT(*) FROM social_posts so WHERE so.username = f.username)) AS social_count, 
@stream := SUM((SELECT COUNT(*) FROM stream_updates st WHERE st.username = f.username)) AS stream_count 
    FROM members f 
    WHERE f.username 
    IN (SELECT friend2 as username FROM list_friends WHERE friend1 = :user 
    AND friend2 <> :user) 
    OR f.username 
    IN (SELECT friend1 as username FROM list_friends WHERE friend2 = :user 
    AND friend1 <> :user) 
    OR f.username = :user 
0

只是增加了一筆算?

SELECT f.username, 
    SUM((SELECT COUNT(id) FROM sites s WHERE s.username = f.username)) site_count, 
    SUM((SELECT COUNT(id) FROM banners b WHERE b.username = f.username)) banner_count, 
    SUM((SELECT COUNT(id) FROM favorites fa WHERE fa.username = f.username)) favorite_count, 
    SUM((SELECT COUNT(id) FROM social_posts so WHERE so.username = f.username)) social_count, 
    SUM((SELECT COUNT(id) FROM stream_updates st WHERE st.username = f.username)) stream_count 
FROM members f 
WHERE f.username 
    IN (SELECT friend2 as username FROM list_friends WHERE friend1 = :user 
    AND friend2 <> :user) 
OR f.username 
    IN (SELECT friend1 as username FROM list_friends WHERE friend2 = :user 
AND friend1 <> :user) 
OR f.username = :user 

如果需要每個用戶的數量,只是添加Group By f.username到底

+0

可惜只是包裝他們SUM不會削減它,我希望它是那麼簡單。這將花費每個用戶的每個計數的總和,這是毫無用處的。例如,如果用戶1的計數返回5,則執行5的總和不會改變結果。由於IN語句中的f.username和用戶名不同,因此group by將無法工作,因此無法如此分組。我試圖通過f.username來做一個組,也嘗試了按用戶名分組,所有結果都沒有改變。 – Bruce

+0

好吧,然後..可能是簡單的方法來做到這一點是計數出來的sql.if使用PHP只是在PHP計數他們 –

+0

這可能實際上是路要走,但我希望基於SQL的解決方案,因爲我必須反正爲數據建立連接,並且所有的數據都被索引,所以我想盡可能在​​mysql中完成。 :) – Bruce