2 votes

Méthode efficace pour calculer une valeur cumulative dans sqlite3

J'ai une table sqlite3 qui indique quand je gagne/perds des points dans un jeu. Exemple/résultat de la requête :

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] 

Je veux maintenant mon total de points de course. Étant donné que je commence avec 1000 points, voici une façon de le faire.

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 

mais cela est très inefficace. Quelle est la meilleure façon de l'écrire ?

MySQL dispose de @variables, ce qui vous permet de faire des choses comme :

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

mais j'utilise sqlite3 et ce qui précède n'est pas du SQL standard ANSI de toute façon.

Plus d'informations sur le db si quelqu'un en a besoin : http://ccgames.db.94y.info/

EDIT : Merci pour les réponses ! Mon dilemme : je laisse n'importe qui exécuter n'importe quelle simple Requête SELECT sur " http://ccgames.db.94y.info/ ". Je veux leur donner un accès utile à mes données, mais pas au point d'autoriser des script ou de permettre des requêtes multiples avec état. J'ai donc besoin d'une seule requête SQL qui peut faire l'accumulation. Voir aussi :
Solution existante pour partager des données de base de données de manière utile mais sûre ?

0voto

RichardTheKiwi Points 58121

SQLite est destiné à être une petite base de données embarquée. Compte tenu de cette définition, il n'est pas déraisonnable de lui trouver de nombreuses limites. La tâche à accomplir n'est pas soluble en utilisant SQLite seul, ou bien elle sera terriblement lente comme vous l'avez constaté. La requête que vous avez écrite est une jointure croisée triangulaire qui ne s'adaptera pas, ou plutôt, qui s'adaptera mal.

La manière la plus efficace d'aborder le problème est de passer par le programme qui utilise SQLite, par exemple si vous utilisiez Web SQL en HTML5, vous pouvez facilement accumuler en JavaScript.

0voto

Sam Saffron Points 56236

Il y a une discussion sur ce problème dans le liste de diffusion sqlite .

Vos 2 options sont :

  1. Parcourez toutes les lignes avec un curseur et calculez la somme courante sur le client.
  2. Stockez des sommes au lieu ou en plus de stocker des points. (Si vous ne stockez que des sommes, vous pouvez obtenir les points en faisant sum(n) - sum(n-1), ce qui est rapide).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X