Эффективный способ вычисления накопленной стоимости в sqlite3 - PullRequest
2 голосов
/ 30 января 2011

У меня есть таблица 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.

Дополнительная информация о БД, если кому-то это нужно: http://ccgames.db.94y.info/

РЕДАКТИРОВАТЬ: Спасибо за ответы! Моя дилемма: я позволю любому запустить один запрос SELECT на "http://ccgames.db.94y.info/". Я хочу дать им полезен доступ к моим данным, но не до такой степени, чтобы создание сценариев или разрешение нескольких запросов с состоянием. Так что мне нужен один SQL-запрос, который может делать накопление. Смотри также:
Существующее решение для совместного использования данных базы данных полезно, но безопасно?

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

Обсуждение этой проблемы ведется в sqlite списке рассылки .

Ваши 2 варианта:

  1. Перебирайте курсор по всем строкам и рассчитывайте сумму на клиенте.
  2. Хранить суммы вместо, а также для хранения баллов.(если вы храните только суммы, вы можете получить очки, выполнив sum (n) - sum (n-1), что быстро).
1 голос
/ 21 февраля 2011

SQLite предназначен для небольшой встроенной базы данных.Учитывая это определение, не лишено смысла находить с ним много ограничений.Данная задача не может быть решена с помощью одного SQLite, или она будет очень медленной, как вы уже обнаружили.Написанный вами запрос представляет собой треугольное перекрестное объединение, которое не будет масштабироваться, а точнее, будет плохо масштабироваться.

Наиболее эффективный способ решения проблемы - это программа, использующая SQLite, например, если выЕсли вы использовали Web SQL в HTML5, вы можете легко накапливать в JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...