从一组中选择一个值

后端开发 2026-07-12

我想从一组中选取一个值。比如:

select single(f.filename), d.id
from document d
  left join document_file f on f.document_id = d.id
group by d.id

每个文档ID对应多个文件。我想返回一个结果集,其中每条记录都是一个唯一的 文档,并且文件名是文档中的某一个文件(我不在意是哪个文件,可以是第一个,或随机的,对我来说都可以)。

我该如何实现?

解决方案

如果你不在意具体哪个文件名值,可以使用 ANY_VALUE() 函数:

SELECT ANY_VALUE(f.filename), d.id 
FROM document d 
LEFT OUTER JOIN document_file f ON f.document_id = d.id 
GROUP BY d.id

这会从分组中返回一个 任意 值,而不会禁用 ONLY_FULL_GROUP_BY SQL模式(我建议你不要禁用该模式)。

Arbitrary 不等同于 random。它可能会在每次执行查询时返回分组中的同一个值,但具体返回哪一个并不由你决定。实际中,它似乎是按索引顺序读取的最后一行的值(至少在当前实现中是这样)。

MySQL对 ANY_VALUE() 函数的实现并不与SQL:2023标准的函数完全兼容。详情请见 https://modern-sql.com/caniuse/any_value


如果你(或阅读此答案的其他人)希望结果是随机的、每次运行查询都不同,下面是一个解决方案:

SELECT filename, id
FROM (
  SELECT f.filename, d.id, 
    ROW_NUMBER() OVER (PARTITION BY d.id ORDER BY d.id, RAND()) AS rownum
  FROM document d
  LEFT OUTER JOIN document_file f ON f.document_id = d.id
) AS df
WHERE rownum = 1;
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章