【发布时间】:2013-03-14 16:25:59
【问题描述】:
我有一个事件结果表,我需要为给定的玩家列表获取每个玩家最近的 n 个事件。
这是在 iOS 上,所以它需要很快。我查看了许多使用子查询或连接的 top-n-per-group 解决方案,但即使在 macbook pro 上,这些解决方案对于我的 100k 行数据集也运行缓慢。到目前为止,我的愚蠢解决方案是执行 6 个单独的查询,因为我最多只能运行 6 个玩家。它不是很慢,但必须有更好的方法,对吧?以下是我现在正在做的事情的要点:
results_by_pid = {}
player_ids = [1,2,3,4,5,6]
n_results = 6
for pid in player_ids:
results_by_pid[pid] = exec_sql("SELECT *
FROM results
WHERE player_id = #{pid}
ORDER BY event_date DESC
LIMIT n_events")
然后我继续我的快乐之路。但是我怎样才能把它变成一个单一的快速查询呢?
【问题讨论】:
-
没有更好的办法。 SQLite 被设计为一个嵌入式 数据库,其中大部分逻辑都保留在应用程序中。为什么你希望它是一个单一的查询?
-
对 sqlite 进行单独调用会产生 io 开销,所以一般来说,尽可能减少总查询不是最好的吗?
-
一般来说,是的。但是,如果您必须经历使最终结果明显更糟的扭曲,则不会。
-
很公平。我的 sql-fu 并不是那么强大,所以我希望一些我无法构建的复杂查询可以更有效地完成此任务。
-
@CL 顺便说一句,请随意添加它作为答案——如果没有人提出其他建议,我会在稍后将其标记为接受。