2015-02-11 49 views
1

我不確定這是否可以完成,我有一個用戶表與用戶活動的相關表連接在一個外鍵上。活動具有不同的類型,例如評論,等等。我需要讓用戶根據每種不同類型的活動進行過濾。在左側選擇多個計數在同一個表上加入

我到目前爲止是這樣的:

SELECT 
     users.*, 
     COUNT(t1.id) AS comments, 
     COUNT(t2.id) AS likes 
FROM users 
    LEFT JOIN activity AS t1 ON users.id = t1.user_id 
    LEFT JOIN activity AS t2 ON users.id = t2.user_id 
WHERE t1.activity_type_id = 1 AND t2.activity_type_id = 2 
GROUP BY users.id 
HAVING comments >= 5 AND likes >= 5 

這似乎是接近,但它的返回與5個都喜歡和評論的計數的用戶,而實際上用戶有5個喜歡和1條評論。

要清楚我想要這個查詢返回誰有5個或更多的喜歡和誰擁有 5個或更多的評論也的用戶。

UPDATE:

我創建了一個SQL小提琴。在這種情況下我有3個用戶:

  • 用戶1:6條的評論,8個喜歡
  • 用戶2:3條的評論,2喜歡
  • 用戶3:5條的評論,2喜歡

我希望查詢只返回用戶1和用戶3,他們各自的喜歡和評論總數。

http://sqlfiddle.com/#!2/dcc63/4

+0

假設我的編輯(上述斜體)是正確的,將 '或' 無法滿足這一要求?你也是外連接表,從中你不選擇列,所以這可能是問題的一部分。考慮提供一個sqlfiddle和期望的結果。 – Strawberry 2015-02-11 08:29:11

+0

我需要這個能夠使用AND以及OR條件。我現在的主要問題是用戶的活動數量不正確。每種類型都返回相同的數量。 – Jason 2015-02-11 08:36:32

+0

刪除GROUP BY和HAVING,並查看您在結果數據集中獲得的記錄......應該提供一些有關爲何無法以此方式工作的信息。 – CBroe 2015-02-11 09:04:24

回答

2

可以使用條件求和做的次數和由於MySQL的方式對待布爾表達式像sum(case when et.name = 'comment' then 1 else 0 end)(「正常」的SQL語法)的表達式可以減少到sum(case when et.name = 'comment')

SELECT 
    u.id, 
    sum(et.name = 'comment') AS comments, 
    sum(et.name = 'like') AS likes 
FROM users AS u 
LEFT JOIN engagements AS e ON u.id = e.user_id 
JOIN engagement_types AS et ON e.engagement_type_id = et.id 
GROUP BY u.id 
HAVING sum(et.name = 'comment') >= 5 
    OR sum(et.name = 'like') >= 5 

結果:

| ID | COMMENTS | LIKES | 
|----|----------|-------| 
| 1 |  6 |  8 | 
| 3 |  5 |  2 | 

Sample SQL Fiddle

+1

這看起來很完美。謝謝! – Jason 2015-02-11 09:57:09