2015-11-02 253 views
3

我正在使用SAM Broadcaster分离类别和它们包含的歌曲。MySQL为每个分组的列值选择一个随机行

我想要的是随机选择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(); 

这将返回:

  • 密封&克罗夫茨 - 夏日微风
  • Doobie兄弟 - 是个傻瓜认为
  • 密封&克罗夫茨 - 钻石女孩
  • 宠物店男孩 - 伦敦西区女孩
  • 人在工作 - 是好约翰尼
  • 乔沃尔什 - 整夜
  • 密封&克罗夫茨 - 更接近
  • 管 - 谈雅后来
  • 的汽车 - 再见爱
  • 迈克尔·斯坦利乐队 - 情人
  • 警察 - 同步性II
  • 乔沃尔什 - 这种生活的幻觉
  • 迈克尔·斯坦利乐队 - 他不能爱你
  • 迈克尔·斯坦利乐队 - 我的小镇
  • 宠物店男孩 - 我做了什么值得吗?

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

目标是从这个列表中选择5个随机歌曲的列表,没有重复的艺术家。

回答

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

+0

所有我必须做的就是添加我加入你的查询,她的工作就像一个魅力。我希望我吠叫正确的树,我觉得我应该能够随机分组。谢谢! – Kilokahn

相关问题