簡體   English   中英

選擇同一表上的左連接具有多個計數

[英]Select with Multiple Counts on Left Join on Same Table

我不確定是否可以做到這一點,我有一個用戶表,並在外鍵上加入了相關的用戶活動表。 活動具有不同的類型,例如評論等。我需要按每種不同類型的活動的數量來過濾用戶。

我到目前為止所擁有的是:

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個或更多評論的用戶。

更新:

我創建了一個SQL Fiddle。 在這種情況下,我有3個用戶:

  • 使用者1:6則留言,8個贊
  • 使用者2:3則留言,2個贊
  • 使用者3:5則留言,2個贊

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

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

您可以使用條件求和來進行計數,並且由於MySQL處理布爾表達式的方式,像sum(case when et.name = 'comment' then 1 else 0 end)的表達式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 |

示例SQL提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM