如何从 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中的表中获取第一列名称
如果表是变量(python),如何从 SQLite 表中选择