2013-07-28 104 views
0

我有2个表将用于:新闻和标签我怎样才能让这个MySQL查询2个表

消息表有相关的音乐表music_id场和标签表具有藏汉作为同一个tag_id列。它为每位艺术家保存多个标签条目。

标签看起来像这样

music_id | tag_id | user_id 
    3  2   7 
    3  3   12 
    9  17  52 

因此,每个用户可以标记与多个标签是彼此不同的艺术家。

我想从每个新闻帖子(news.music_id)中获取music_id,并在每行中找到每位艺术家的顶部标签。

所以它会像

music_id | top_tag 
    22   6 
    15   4 
    13   9 
    22   6 
    15   4 

之后,我想最流行的订购标签。

所以我留下了一个结果像

count | top_tag 
    2  6 
    2  4 
    1  9 

希望这是有道理的。我真的被卡住了!

+0

其中是表标记和第三个表? –

+0

你说你想在每一行找到每位艺术家的top_tag。你打算如何确定哪个是顶级标签?你还说你想按照受欢迎程度排列top_tags。你如何定义人气?你能否澄清这些方面? – dseibert

+0

对不起,我无法解释它。标签表格中每个艺术家有多个标签。一个简短的例子是我的第一个代码片段。 每位艺术家都可以使用无限量的不同标签进行标记,以及同一标签的多个标签。 我想要做的是从新闻表中获取music.id,并找到music.id最受欢迎的标签。所以最受欢迎的标签将是music_id旁边的条目最多的标签。 因此,对于新闻表中的每个帖子,还有一列包含了艺术家最受欢迎的标签。 –

回答

0

我正在将问题解释为“通过音乐id的数量排序标签,它们是音乐ID中最受欢迎的标签”。以下查询使用子查询来计算每个music_id上的标记计数。它还为最终聚合找到每个`music_id'的最大计数:

select mt.tag_id, count(*) as musiccnt 
from (select music_id, tag_id, count(*) as cnt 
     from tags t 
     group by music_id 
    ) mt join 
    (select music_id, max(cnt) as maxcnt 
     from (select music_id, tag_id, count(*) as cnt 
      from tags t 
      group by music_id 
      ) mt 
     group by music_id 
    ) m 
    on mt.music_id = m.music_id and mt.cnt = m.maxcnt 
group by mt.tag_id 
order by musiccnt desc 
相关问题