每个分组列值随机选择一行的MySQL查询

3

我正在使用SAM Broadcaster,它将歌曲分成不同的类别。

我的需求是随机显示5位艺术家及其歌曲的选择列表,并且不能重复。目前我已经做了以下工作:


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

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();

这将返回:
  • 海豹与克罗夫茨(Seals & Crofts) - 夏日微风
  • 杜比兄弟(The Doobie Brothers) - What A Fool Believes
  • 海豹与克罗夫茨(Seals & Crofts) - 钻石女孩
  • Pet Shop Boys - 西区女孩
  • Men at Work - Be Good Johnny
  • 乔·沃尔什(Joe Walsh) - All Night Long
  • 海豹与克罗夫茨(Seals & Crofts) - Get Closer
  • The Tubes - Talk To Ya Later
  • 汽车乐队(The Cars) - 再见爱情
  • 迈克尔·斯坦利乐队(Michael Stanley Band) - 恋人
  • 警察乐队(The Police) - 同步性II
  • 乔·沃尔什(Joe Walsh) - A Life Of Illusion
  • 迈克尔·斯坦利乐队(Michael Stanley Band) - 他不能爱你
  • 迈克尔·斯坦利乐队(Michael Stanley Band) - My Town
  • Pet Shop Boys - 我对此做了什么?
现在我想更进一步,按艺术家分组并限制为5,但我想要每个标题的随机项。目前,按艺术家分组时,我总是以ABC顺序获取标题。因此,无论何时显示他们的名字,“SeaIs & Crofts”的“Diamond Girl”总是列出。每个其他组都是一样的。
目标是有一个包含此列表中5首随机歌曲且没有重复艺术家的列表。
1个回答

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

我所要做的就是在你的查询中添加我的连接,她就像魔法般地工作了。我希望我找对了方法,感觉我应该能够通过随机分组来完成它。谢谢! - Kilokahn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接