如何从 SQLite 中的表中选择最新的 100 个不同条目?

Posted

技术标签:

【中文标题】如何从 SQLite 中的表中选择最新的 100 个不同条目?【英文标题】:How to select the latest 100 distinct entries from a table in SQLite? 【发布时间】:2019-11-20 13:29:16 【问题描述】:

尽管看起来很简单,但我一直在努力解决以下任务:

从 SQLite 的表中选择最新的 100 个不同的条目

详细介绍

我在基于 Objective-C 的 ios 11+ 项目中使用 SQLite。应用数据库将ToDo 条目列表存储在一个表中:

ID  |  Date        |  Note
----+--------------+---------
1   |  2019-10-01  |  ANote
1   |  2019-10-10  |  Note1
2   |  2019-10-11  |  Note2 
3   |  2019-10-12  |  Note1 

现在我想从这个表中查询最新的 100 条不同的笔记:

按日期降序对表格进行排序 搜索条目并将注释添加到结果中(如果结果中还没有) 找到 100 个不同的音符后停止

听起来很简单,不是吗:-)

我尝试了什么

SELECT Note FROM ToDo ORDER BY Date DESC LIMIT 100

  Note1
  Note2
  Note1
  ANote

这当然行不通,因为它不寻找不同的值(Note1 被包含两次......)。但是,它会返回按正确日期顺序排列的注释

SELECT DISTINCT(Note) FROM ToDo ORDER BY Date DESC LIMIT 100

  Note2
  Note1
  ANote

现在Note1 按预期只包含一次,但是日期顺序不正确了。

SELECT DISTINCT(Note), Date FROM ToDo ORDER BY Date DESC LIMIT 100

  Note1
  Note2
  Note1
  ANote

SELECT 语句中包含Date 会导致正确的日期顺序现在结果不再不同。

SELECT Note FROM ToDo GROUP BY Note ORDER BY Date DESC LIMIT 100

  SQLite on iOS:       SQLiteBrowser on Mac

  Note2                Note1
  Note1                Note2
  ANote                ANote

虽然这 DOES WORK 在我的 Mac 上的 SQLiteBrowser 中测试它时,它在我的 iOS 应用程序中运行它时失败。在 iOS 上,这种方法与 DISTINCT(Note) 存在相同的问题,并提供错误的日期顺序

SELECT DISTINCT(Note) FROM (SELECT Note FROM Bookings ORDER BY Date DESC) AS n LIMIT 100

  Note2
  Note1
  ANote

SELECT Note FROM (SELECT Note FROM Bookings ORDER BY Date DESC) AS n GROUP BY Note LIMIT 100

  ANote
  Note1
  Note2

再次没有正确的数据顺序...


所以,我的想法已经不多了。 似乎 iOS 上的 SQLite 有一些特别之处,SELECT Note FROM ToDo GROUP BY Note ORDER BY Date DESC LIMIT 100 不起作用。

我当然可以在代码中解决这个问题。但是知道如何在 SQL 中解决这个问题吗?

【问题讨论】:

这行得通吗? SELECT DISTINCT(Note), MAX(Date) FROM ToDo ORDER BY Date DESC LIMIT 100——另外,避免使用名为“日期”的列,因为它是保留字。 【参考方案1】:

您的问题源于您需要为每个不同的Note 指定要考虑的Date,以防有多个。您可以通过按注释分组并取最大值(或最小值,无论您想要什么)日期来解决这个问题:

SELECT Note, MAX(Date) AS Date 
FROM ToDo 
GROUP BY Note 
ORDER BY MAX(Date) DESC LIMIT 100

【讨论】:

以上是关于如何从 SQLite 中的表中选择最新的 100 个不同条目?的主要内容,如果未能解决你的问题,请参考以下文章

SQLite:如何使用复合键从单个表中选择“每个用户的最新记录”?

如何从sqlite +phonegap中的表中获取第一列名称

如何使用Android从sqlite中的表中删除所有记录?

如果表是变量(python),如何从 SQLite 表中选择

有没有一种方法可以使用 android-sqlite 游标从列数未知的表中选择 *

从 jsonb 数组包含具有特定属性的元素的表中选择