【问题标题】:Efficient way to compute accumulating value in sqlite3在 sqlite3 中计算累积值的有效方法
【发布时间】:2011-01-30 05:07:33
【问题描述】:

我有一个 sqlite3 表,可以告诉我何时在游戏中获得/失去积分。样本/查询结果:

SELECT time,p2 FROM events WHERE p1='barrycarter' AND action='points' 
ORDER BY time; 

1280622305|-22 
1280625580|-9 
1280627919|20 
1280688964|21 
1280694395|-11 
1280698006|28 
1280705461|-14 
1280706788|-13 
[etc] 

我现在想要我的跑分总数。鉴于我以 1000 分开始, 这是一种方法。

SELECT DISTINCT(time), (SELECT 
1000+SUM(p2) FROM events e WHERE p1='barrycarter' AND action='points' 
AND e.time <= e2.time) AS points FROM events e2 WHERE p1='barrycarter' 
AND action='points' ORDER BY time 

但这是非常低效的。有什么更好的方法来写这个?

MySQL 具有@variables,因此您可以执行以下操作:

SELECT time, @tot := @tot+points ... 

但我使用的是 sqlite3 并且上面的内容无论如何都不是 ANSI 标准 SQL。

如果有人需要,更多关于 db 的信息:http://ccgames.db.94y.info/

编辑:感谢您的回答!我的困境:我让任何人运行任何 单个http://ccgames.db.94y.info/”上的 SELECT 查询。我想给 他们有用地访问我的数据,但不允许 编写脚本或允许多个带有状态的查询。所以我需要一个 可以做积累的SQL查询。另见:
Existing solution to share database data usefully but safely?

【问题讨论】:

  • @Barry:欢迎来到这个网站。不幸的是,这个问题离题了,可能属于 StackOverflow。此网站的问题应符合常见问题解答中的标准:codereview.stackexchange.com/faq
  • 在这种情况下,您最好在代码中处理结果查询时保留一个运行总计,而不是尝试让数据库来执行此操作。

标签: sql sqlite


【解决方案1】:

SQLite 旨在成为一个小型嵌入式数据库。鉴于该定义,找到它的许多限制并非不合理。手头的任务不能单独使用 SQLite 解决,否则它会像您发现的那样非常慢。您编写的查询是一个三角形交叉连接,不会缩放,或者说缩放很差。

解决问题的最有效方法是通过使用 SQLite 的程序,例如如果你在 HTML5 中使用 Web SQL,你可以很容易地在 JavaScript 中积累。

【讨论】:

    【解决方案2】:

    sqlite mailing list 中有关于这个问题的讨论。

    您的 2 个选项是:

    1. 使用游标遍历所有行并计算客户端上的运行总和。
    2. 存储总和而不是存储点数。 (如果您只存储总和,则可以通过 sum(n) - sum(n-1) 快速获得积分)。

    【讨论】:

      猜你喜欢
      • 2019-06-06
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 2011-02-15
      • 2017-05-13
      相关资源
      最近更新 更多