MySQL为每个分组列值选择一个随机行

时间:2015-11-02 22:23:22

标签: mysql join group-by

我正在使用SAM Broadcaster来分类类别和它们包含的歌曲。

我想要的是一个5个随机艺术家的列表,随机选择他们的歌曲,没有重复的艺术家。这是我到目前为止所做的:

我有一个名为“经典”的类别:

select ID from category where name = 'Classics';

返回:11

因此,我可以获得类别列表中所有项目的列表:

SELECT artist, title 
FROM songlist LEFT OUTER JOIN categorylist on songlist.id = categorylist.songID 
WHERE categorylist.categoryID = 11 ORDER BY RAND();

返回:

  • 密封件& Crofts - Summer Breeze
  • Doobie兄弟 - 傻瓜相信
  • 密封件& Crofts - Diamond Girl
  • 宠物店男孩 - 西区女孩
  • 工作中的男人 - 做好约翰尼
  • Joe Walsh - 整夜漫长
  • 密封件& Crofts - 更加贴心
  • The Tubes - 与Ya Later谈话
  • The Cars - Bye Bye Love
  • Michael Stanley Band - Lover
  • The Police - Synchronicity II
  • Joe Walsh - 一种幻想的生活
  • 迈克尔斯坦利乐队 - 他不能爱你
  • Michael Stanley Band - 我的城镇
  • 宠物店男孩 - 我该怎么做才能得到这个?

现在我想更进一步,按照艺术家对此列表进行分组并限制5但是我想要每个标题的随机项目。现在,当我按艺术家分组时,我总是以ABC顺序获得标题。所以Seals& Crofts的“钻石女孩”总是在他们的名字显示时列出。与其他小组一样。

目标是列出此列表中的5首随机歌曲,没有重复艺术家。

1 个答案:

答案 0 :(得分:2)

此查询应该可以解决问题(故意将类别选择放在一边以使其更具可读性):

SELECT artist,
       title
FROM   (SELECT artist,
               title,
               CASE
                 WHEN @artist != artist THEN @rn := 1
                 ELSE @rn := @rn + 1
               end rn,
               @artist := artist
        FROM   (SELECT *
                FROM   songlist
                ORDER  BY Rand()) a,
               (SELECT @rn := 0,
                       @name := NULL) r
        ORDER  BY a.artist) s
WHERE  rn <= 1
ORDER  BY Rand()
LIMIT  5 

在此处查找演示:sqlfiddle