我有一个播客剧集表
id | title | podcast_id | publication_date
1 | "a" | 1 | today
2 | "b" | 2 | today
3 | "c" | 1 | yesterday
4 | "d" | 2 | yesterday
通过此查询,我可以获得每个播客的最新剧集。
SELECT DISTINCT ON (episodes.podcast_id) episodes.* FROM "episodes"
WHERE ...
ORDER BY episodes.podcast_id, "episodes"."publication_date" DESC
结果
id | title | podcast_id | publication_date
1 | "a" | 1 | today
2 | "b" | 2 | today
我想随机化返回的播客的顺序,以便 podcast_id
2 可能会在 1 之前返回,但添加 RANDOM()
进入决赛ORDER BY
子句更改为给定播客选择的剧集。
总结:我希望以随机顺序播放每个播客的最新剧集。
编辑:我应该提到这个查询是将许多 ActiveRecord 范围链接在一起的结果。这是翻译为 ActiveRecord 的最终答案
# This ActiveRecord statement is equivalent to the above SQL query
episodes = Episode
.unscoped
.select("DISTINCT ON (episodes.podcast_id) episodes.*")
.order("episodes.podcast_id, episodes.publication_date")
Episode
.unscoped
.from("(#{sql.to_sql}) episodes")
.order("random()")
我不确定这是否是一个好方法。我认为它们的优点是
- 单个查询
- 结果是ActiveRecord_Relation,可以继续链接
limit
或pluck
最佳答案
select *
from (
SELECT DISTINCT ON (episodes.podcast_id) episodes.*
FROM "episodes"
WHERE ...
ORDER BY episodes.podcast_id, "episodes"."publication_date" DESC
) s
order by random()
关于sql - 如何随机化 DISTINCT ON 结果的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25410632/