2013-03-04 54 views
0

我有两个表;一个带有文本,主题,用户名为'Messages Table'的列,另一个表具有名为'Topic Table'的Topic Topic,Title。MYSQL计算唯一行上的哪个然后左加入并按该计数排序然后限制为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名。

帮助。

+0

显示你的表格布局,最好使用CREATE TABLE语法。如果您可以提供一些示例数据以及预期的输出结果,那将会很好。对我们和您来说最有帮助和最简单的方法是在http://SQLFiddle.com上创建示例并发布链接。 – mvp 2013-03-04 01:45:13

+0

完成。基本的基本示例,但它是主要的。任何帮助都会很棒。 – Tom 2013-03-04 01:57:39

回答

0

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

+0

太棒了。这是否按降序排序COUNT并将输出限制为3行? – Tom 2013-03-04 02:08:48

+0

现在确实如此。查看更新的答案。 – peterm 2013-03-04 02:09:27

+0

这工作完美。谢谢! – Tom 2013-03-04 02:21:03

0

我假设在您的查询中,您正在寻找汉克?如果是的话,这应该使用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 Fiddle Demo

- 编辑 -

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 Fiddle Demo

这应该返回3个记录每个用户 - 如果您只想要一个用户,请添加到WHERE条款。

+0

这起作用。但是,如何按COUNT降序排列并将其限制为3呢? – Tom 2013-03-04 02:06:56

+0

@tomuky - 更新了我的答案 - 祝你好运。 – sgeddes 2013-03-04 02:12:36

+0

其他答案更符合我的确切需求。您的版本功能更强大,可以在我网站的其他区域中使用。谢谢! – Tom 2013-03-04 02:22:06