我正在使用 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();
返回:
- Seals & Crofts - 夏日微风
- 杜比兄弟 - 傻瓜相信什么
- Seals & Crofts - 钻石女郎
- 宠物店男孩 - 西区女孩
- 工作中的男人 - 做个好强尼
- Joe Walsh - 通宵达旦
- Seals & Crofts - 走得更近
- The Tubes - 稍后与你交谈
- 汽车总动员 - 再见,爱
- Michael Stanley 乐队 - 情人
- 警察 - 同步 II
- Joe Walsh - 虚幻的人生
- Michael Stanley 乐队 - 他不能爱你
- Michael Stanley 乐队 - 我的小镇
- Pet Shop Boys - 我做了什么才应得的?
现在我想更进一步,将这个列表按艺术家分组并限制 5 个,但我想要每个标题的随机项目。现在,当我按艺术家分组时,我总是按 ABC 顺序获得标题。所以 Seals & Crofts 的“钻石女郎”总是在他们的名字出现时被列出来。与其他所有组相同。
目标是从该列表中获得一个包含 5 首无重复艺术家的随机歌曲的列表。
最佳答案
这个查询应该可以解决问题(故意不考虑类别选择以使其更具可读性):
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
关于MySQL为每个分组的列值选择一个随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33488127/