0

我有 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

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

4

1 回答 1

0

我将问题解释为“按音乐 id 的数量对标签进行排序,其中它们是音乐 id 上最受欢迎的标签”。以下查询使用子查询按标签计算 each 上的计数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
于 2013-07-28T19:03:10.443 回答