簡體   English   中英

MYSQL在“左連接”處計數唯一行,然后按該計數排序,然后限制為3

[英]MYSQL Count unique rows on Where then Left Join and Sort by that count and then Limit to 3

我有兩個桌子。 一個帶有“文本”,“主題”,“用戶”列,稱為“消息表”,另一個表具有“主題”,“標題”列,稱為“主題表”。

例:

消息表

Text        Topic    User
Hi          Ball     Hank
Hello       Foot     John
Sup         Ball     Hank
Nuthin'     Foot     Hank
No          Volley   Hank

主題表

Topic     Title
Ball      Basketball
Foot      Football
Volley    Volleyball

我想顯示用戶最喜歡的三個主題以及標題。

結果:漢克的前3個主題

Topic Count     Topic      Title
2               Ball       Basketball
1               Foot       Football
1               Volley     Volleyball

我必須對特定用戶在“消息表”中擁有的唯一主題進行計數,然后將其加入“主題表”,以便我可以獲取標題,然后按主題數降序對結果進行排序,這樣我就可以獲取用戶最常用的主題。 然后將結果限制為3行以獲取前3位。

救命。

我假設在您的查詢中,您正在搜索Hank? 如果是這樣,這應該使用COUNTGROUP BY起作用:

SELECT Count(m.Topic), t.topic, t.title
FROM messages m
   JOIN topic t on m.topic=t.topic
WHERE m.user = 'Hank'
GROUP BY t.topic

SQL小提琴演示

- 編輯 -

SELECT user, cnt, topic, title
FROM (
  SELECT 
    @rowNum:=IF(@prevUser=m.user,@rowNum+1,1) rn,
    @prevUser:=m.user,
    m.cnt, 
    t.topic, 
    t.title, 
    m.user
  FROM (SELECT Count(Topic) cnt, topic, user FROM messages GROUP BY user, topic ORDER BY user, Count(Topic) DESC) m
     JOIN topic t on m.topic=t.topic
     JOIN (SELECT @rowNum:= 0) t
  ) t
WHERE RN <= 3
ORDER BY User

SQL小提琴演示

這應該為每個用戶返回3條記錄-如果只需要一個用戶,則添加到WHERE子句中。

如果僅Hank需要TOP-3主題,請嘗試

SELECT COUNT(m.Topic) `Count Topic`, m.Topic, MIN(t.Title) Title
  FROM messages m LEFT JOIN
       topics t ON m.Topic = t.Topic 
WHERE User = 'Hank'
GROUP BY m.Topic 
ORDER BY `Count Topic` DESC LIMIT 3

輸出:

| COUNT TOPIC |  TOPIC |      TITLE |
-------------------------------------
|           2 |   Ball | Basketball |
|           1 |   Foot |   Football |
|           1 | Volley | Volleyball |

sqlfiddle

暫無
暫無

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

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