2010-07-30 8 views
0

Heres une table, le moment où la requête est exécutée par exemple est maintenant 2010-07-30 22:41:14mySql somme une colonne et retour uniquement les entrées avec et l'entrée en 10 dernières minutes

number | person | timestamp 
45  mike  2008-02-15 15:31:14 
56  mike  2008-02-15 15:30:56 
67  mike  2008-02-17 13:31:14 
34  mike  2010-07-30 22:31:14 
56  bob  2009-07-30 22:37:14 
67  bob  2009-07-30 22:37:14 
22  tom  2010-07-30 22:37:14 
78  fred  2010-07-30 22:37:14 

Id comme une requête qui peut additionner le nombre pour chaque personne. Ensuite, n'affichez que les totaux de nom qui ont une entrée récente indiquent les 60 dernières minutes. Le difficile semble être que, bien qu'il soit possible d'utiliser ET timestamp> now() - INTERVAL 600, cela a pour effet d'arrêter la somme complète du nombre.

les résultats que je voudrais en haut sont

Mike 202 
tom 22 
fred 78 

bob n'est pas inclus sa dernière entrée ne suffit pas récemment son d'un an! Mike, bien qu'il ait plusieurs entrées anciennes, est valide parce qu'il a une entrée récemment - mais clé, il ajoute toujours son plein 'nombre' et pas seulement ceux avec la période de temps.

poursuivez votre tour en une seule requête! et merci

andy.

Répondre

1

Vous voulez une clause HAVING:

select name, sum(number), max(timestamp_column) 
from table 
group by name 
HAVING max(timestamp_column) > now() - INTERVAL 600; 
+0

je vais proposer une solution avec deux requêtes reliées entre elles ... ne pas savoir comment j'ai oublié la clause HAVING. Incidemment, je ne crois pas que vous ayez besoin d'inclure le timestamp_column dans votre liste de sélection à moins que ce soit nécessaire pour l'affichage. –

+0

oui, cela ressemble à la bonne réponse vs ma version paresseuse ci-dessous :) –

+0

djacobsen: pour de nombreux RDBMS, vous n'avez pas. Pour le mysql de l'OP, ce n'est pas le cas. Pour le standard SQL, vous le faites, donc je l'ai inclus pour être portable et sûr. – tpdi

0

andrew - dans l'esprit de l'éducation, je ne vais pas afficher la requête (en fait, je suis paresseux, mais ne dites pas à tout le monde):).

En gros, vous devez faire une sous-sélection parmi vos critères principaux. dans le code psuedo serait:

select person, total as (select sum(number) from table1 t2 where t2.person=t1.person) 
from table1 t1 where timestamp > now() - INTERVAL 600 

qui va exploser, mais vous obtenez l'essentiel ... jim

Questions connexes