从一组中选择一个值
我想从一组中选取一个值。比如:
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。