Sqlite 查询:每个播客的最近五集

Posted

技术标签:

【中文标题】Sqlite 查询:每个播客的最近五集【英文标题】:Sqlite Query: Five Most Recent Episode of Each Podcast 【发布时间】:2021-01-22 19:32:57 【问题描述】:

我的应用程序将数百个播客剧集存储在一个 SQLite 表中。我正在寻找返回五个最新剧集的查询每个播客(播客存储在不同的表中)。

相关的表格列是

media_id = 主键(剧集的唯一标识符) publication_date = 可用于查找最新剧集 episode_remote_podcast_feed_location = 定义与播客的关系

这是我尝试过的:

SELECT *
FROM episodes a
WHERE a.media_id IN (
    SELECT b.media_id
    FROM episodes b 
    WHERE a.episode_remote_podcast_feed_location = b.episode_remote_podcast_feed_location
    ORDER BY b.episode_remote_podcast_feed_location, b.publication_date DESC
    LIMIT 5
) 
ORDER BY a.episode_remote_podcast_feed_location, a.publication_date

上述查询总是返回五集(总共)——无论我有多少播客。至少这些剧集都属于同一个播客。 (剧集对于episode_remote_podcast_feed_location 具有相同的值。)

需要的解决方案:我需要一个查询来为每个播客返回五集(最近的集)。因此,如果应用程序只存储了一个播客,则返回五集。如果应用程序存储了三个播客,则返回 15 集:播客 b 为 5 集,播客 c 为 5 集。

其他信息:我需要能够在 android 应用程序中使用查询。与 Android 捆绑的 SQLite 版本是not the most current。 Android 不支持某些 SQLite 功能,例如窗口函数(另请参阅:https://***.com/a/55069907/14326132)。

【问题讨论】:

【参考方案1】:

您可以在子查询中使用row_number() 来枚举每个播客的剧集,然后在外部查询中过滤每个播客的前 5 个:

select *
from (
    select e.*, 
        row_number() over(
            partition by episode_remote_podcast_feed_location 
            order by  publication_date desc
        ) rn
    from episodes e
) e
where rn <= 5

在不支持窗口函数的 SQLite 版本中,替代方法是相关子查询:

select *
from episodes e
where (
    select count(*) 
    from episodes e1 
    where 
        e1.episode_remote_podcast_feed_location = e.episode_remote_podcast_feed_location 
        and e1.publication_date  >= e.publication_date 
) <= 5

【讨论】:

谢谢。看起来很棒。我以前不知道窗口函数。有一个问题。我在 Android 上使用 SQLite。而且Android捆绑的SQLite版本好像不支持窗口函数(***.com/questions/55067466/…)。我将相应地编辑我最初的问题。 您的更新解决了我的问题。谢谢你。这非常有帮助。

以上是关于Sqlite 查询:每个播客的最近五集的主要内容,如果未能解决你的问题,请参考以下文章

如何跟踪用户收听特定播客的时间

如何在 SQLITE3 中查询最近的行

用于刷新单个 iTunes 播客的 Applescript 代码

使用 Sqlite flutter BETWEEN 查询返回最近 2 天的记录

来传智播客的目的

从视频制作音频播客的服务? [关闭]