首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL为每个分组列值选择一个随机行

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

Stack Overflow用户
提问于 2015-11-02 22:23:21
回答 1查看 451关注 0票数 3

我正在使用SAM广播公司,它将分类和它们所包含的歌曲分开。

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

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

代码语言:javascript
复制
select ID from category where name = 'Classics';

这一数字: 11

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

代码语言:javascript
复制
SELECT artist, title 
FROM songlist LEFT OUTER JOIN categorylist on songlist.id = categorylist.songID 
WHERE categorylist.categoryID = 11 ORDER BY RAND();

这将返回:

  • 海豹与鳄鱼-夏季风
  • 杜比兄弟-傻瓜相信什么
  • 海豹与鳄鱼-钻石女孩
  • 宠物店男孩-西区女孩
  • 工作中的男人-做个好约翰尼
  • 乔·沃尔什-通宵
  • 海豹和克罗夫茨-靠近点
  • 管-以后再和雅谈
  • 汽车-再见,爱
  • 迈克尔·斯坦利乐队-情人
  • 警察-同步性二
  • 乔·沃尔什--幻想的生活
  • 迈克尔·斯坦利·班德-他不能爱你
  • 迈克尔·斯坦利乐队-我的小镇
  • 宠物店男孩-我做了什么值得这样做?

现在,我想走得更远,按艺术家对这个列表进行分组,限制5,但我想要每个标题中的一个随机项目。现在,当我按艺术家分组时,我总是按ABC顺序得到标题。因此,海豹和克罗夫茨的“钻石女孩”总是列在他们的名字显示。其他团体也一样。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-02 23:31:12

这个查询应该做到这一点(有意将类别选择排除在使其更具可读性的方式之外):

代码语言:javascript
复制
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 

在这里找到一个演示:木琴

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33488127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档