0

我有两张桌子;一个具有列文本、主题、用户称为“消息表”,另一个表具有列主题、标题称为“主题表”。

例子:

消息表

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 行。

帮助。

4

2 回答 2

0

我假设在您的查询中,您正在搜索 Hank?如果是这样,这应该使用COUNTand工作GROUP 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 子句。

于 2013-03-04T01:59:06.447 回答
0

如果您只需要 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

于 2013-03-04T02:03:37.267 回答