如何用MySQL查询每张专辑中时长最短的歌曲名称
解决MySQL查询每张专辑最短时长歌曲的问题
方案一:子查询关联(兼容低版本MySQL)
先通过子查询找出每张专辑对应的最短曲目时长,再关联所有表筛选出符合条件的歌曲:
SELECT al.name AS 专辑名称, c.name AS 最短时长歌曲名称 FROM album al JOIN links l ON l.album_id = al.id JOIN composition c ON l.composition_id = c.id JOIN ( SELECT l.album_id, MIN(c.duration) AS min_duration FROM links l JOIN composition c ON l.composition_id = c.id GROUP BY l.album_id ) AS album_min ON al.id = album_min.album_id AND c.duration = album_min.min_duration;
方案二:窗口函数(MySQL 8.0及以上版本可用)
利用ROW_NUMBER()窗口函数按专辑分组,对曲目按时长升序排序,取排序为1的记录(即最短时长曲目):
SELECT 专辑名称, 最短时长歌曲名称 FROM ( SELECT al.name AS 专辑名称, c.name AS 最短时长歌曲名称, ROW_NUMBER() OVER(PARTITION BY al.id ORDER BY c.duration ASC) AS rn FROM album al JOIN links l ON l.album_id = al.id JOIN composition c ON l.composition_id = c.id ) AS ranked WHERE rn = 1;
补充说明
- 若专辑内有多首时长相同的最短歌曲,方案一会返回所有符合的歌曲;方案二则仅返回其中一首,如需返回全部,可将
ROW_NUMBER()替换为RANK()。 - 你原SQL的问题在于:
GROUP BY al.name后直接选取c.name不符合MySQL默认开启的ONLY_FULL_GROUP_BY规则,且HAVING无法直接关联专辑内的最小时长曲目,因此需要通过子查询或窗口函数先定位最短时长,再匹配对应歌曲。
内容的提问来源于stack exchange,提问作者Alexander Tukanov
相关产品推荐
相关产品推荐

