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

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

返回:

  • 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/

相关文章:

mysql - 从值的子集中选择多个最小值

mysql group 通过使用范围记录值

mysql - 查找一个日期范围和一个时间范围之间的交集时间

mysql - 在 SQL 中执行 CASE WHEN 语句时出现错误

python - MySQLdb Python - 测试数据库

jpa - 获取与 JPA 中的条件查询连接的两个表的所有列

php - 如何根据对另一个表的查询结果对一个表运行查询?

mysql 按设置 id 进行分组

sql - 不能在同一查询中使用group by和over(partition by)吗?

mysql - 检查 SQL 查询中是否使用了索引?