You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:05:21