能否将针对tasks和entries表的两次查询合并为单次查询?
单个查询实现为每个活跃Task获取随机Entry
当然可以用单次查询实现需求,同时保留每个活跃Task对应一个随机Entry的限制,这里提供两种适用于PostgreSQL的实现方式:
方式一:使用窗口函数ROW_NUMBER()
WITH task_entries AS ( SELECT t.id AS task_id, t.channel_id, e.name, e.description, ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY random()) AS rn FROM tasks t JOIN entries e ON t.type = e.type WHERE t.is_active = true ) SELECT channel_id, name, description FROM task_entries WHERE rn = 1;
逻辑说明:
- 通过
JOIN关联所有活跃Task(t.is_active = true)和对应类型的Entry - 利用
ROW_NUMBER()窗口函数,按每个Task的ID分组(PARTITION BY t.id),分组内的Entry按随机顺序排序(ORDER BY random()),这样每个分组里的第一条记录(rn = 1)就是该Task对应的随机Entry - 最后筛选出每组的第一条记录,得到目标结果
方式二:使用PostgreSQL特有的DISTINCT ON
SELECT DISTINCT ON (t.id) t.channel_id, e.name, e.description FROM tasks t JOIN entries e ON t.type = e.type WHERE t.is_active = true ORDER BY t.id, random();
逻辑说明:
DISTINCT ON (t.id)会强制每个Task ID只返回一条记录ORDER BY子句先按Task ID分组,再按随机顺序排序,这样每个分组的第一条记录就是随机选中的Entry,语法更简洁
内容的提问来源于stack exchange,提问作者theberzi
相关产品推荐
相关产品推荐

