2014-03-14 67 views
0

我有三個表:SQL結合計數與加盟

Messages 
messageid | userid | text 
Ex: 1 | 1303 | hey guys 

Users 
userid | username 
Ex: 
1303 | trantor 
1301 | tranro1 
1302 | trantor2 

Favorites 
messageid | userid 
Ex: 
1 | 1302 
1 | 1301 

我想要做什麼,是顯示了用戶名的表,計算他們的消息被收藏一定數量的次數倍。在上面的例子中,我想要查詢「每個用戶有多少消息已經被喜歡兩次?」 ,它會顯示有一行說

trantor | 1 

自然延伸是與「至少2」更換兩次準確,一表「超過6」等我試着用加入到計數相結合,發現自己很困惑。而且由於表格很大,我得到了數量,但沒有信心我的查詢工作正常。我已閱讀this article但我仍然困惑:L

我有什麼至今:

SELECT USERS.username, COUNT(FAVORITES.id) FROM USERS INNER JOIN FAVORITES ON FAVORITES.userID=USERS.id WHERE COUNT(FAVORITES.id) > 2; 

但是,我認爲它的工作原理。

在S.O.關於「相關子查詢」,我發現了these questions,但我徹底困惑。

會是這樣的嗎?

SELECT USERS.username, 
,  (  SELECT COUNT(FAVORTIES.userid) 
       FROM FAVORITES INNER JOIN ON MESSAGES 
       WHERE FAVORITES.messageid = MESSAGES.messageid 
     ) 
FROM USERS 

回答

0

有幾件事你應該知道在SQL中的聚合函數。首先,如果您正在選擇聚合功能,則需要執行GROUP BY。其次,涉及集合函數的任何條件都將與HAVING子句而不是WHERE一起使用。

GROUP BY將應用於您正在選擇的任何聚合函數旁邊的列。

這是一個基本結構:

SELECT attribute1, COUNT(attribute2) 
FROM someTable 
GROUP BY attribute1 
HAVING COUNT(attribute2) > 2; 

應用其他任何你正在使用如JOINSORDER BY,什麼不是。

:有一定的順序,這些條款必須在如ORDER BYHAVING後去,附帶GROUP BY等等之後。

如果我記得正確,操作順序去:

SELECT 
FROM 
WHERE 
GROUP BY 
HAVING 
ORDER BY 
0

當您使用聚合函數,如COUNT()你將需要與HAVING一起使用GROUP BY而不是WHERE

SELECT USERS.username, COUNT(FAVORITES.id) 
FROM USERS 
INNER JOIN FAVORITES 
ON FAVORITES.userID=USERS.id 
GROUP BY USERS.username 
HAVING COUNT(FAVORITES.id) > 2; 

From documentation

如果在不包含GROUP BY子句的語句中使用組函數,則它等同於在所有行上進行分組。