2012-08-28 6 views
0

J'ai une table comme ci-dessous:Sélectionnez mysql

uid nid  points date      reason 
36 116  2  2012-08-28 11:52:12   session 
31 110  2  2012-08-23 15:47:47   session 
36 115  2  2012-08-27 11:52:48   session 

comme u peut voir uid n'est pas unique, il peut être répété. Ce dont j'ai besoin est de sélectionner la somme des points pour chaque identifiant entre la date (30 jours avant). Par exemple: somme uid36 = à 4. Ce que j'ai essayé:

$start_time = mktime(0, 0, 0, $today["mon"], ($today["mday"] - 30), $today["year"]);//30 days before 
$end_time = time(); 
$query = db_query("SELECT uid,sum(points), date FROM users_history WHERE date BETWEEN '$start_time' AND '$end_time'"); 

mais comment sélectionner pour chaque id

Répondre

4

Vous devez GROUP BY uid et date est meanless dans votre requête si vous êtes utilisant la fonction d'agrégat SUM.

SELECT uid, SUM(points) 
FROM users_history 
WHERE date BETWEEN DATE_SUB(CURDATE(), INTERVAL 30 day) AND NOW() 
GROUP BY uid 

Et s'il n'y a pas de date future, alors vous ne devez

WHERE date >= DATE_SUB(CURDATE(), INTERVAL 30 day) 
+0

méfiez-vous également que' start_time' et $ 'end_time' $ seront soit doivent être passés à travers ['FROM_UNIXTIME()'] (http://dev.mysql.com/doc/fr/date-and-time-functions.html#function_from-unixtime) ou formatés comme des littéraux appropriés pour MySQL (par exemple en utilisant ['date()'] (http://php.net/manual/fr/function.date.php)). – eggyal

+0

merci pour les réponses –

1

pour que vous devez votre groupe uid.
uid SELECT, somme (points), date à partir users_history Si la date ENTRE 'start_time $' ET 'end_time de $' » groupe par uid,

0
SELECT uid, SUM(points) FROM users_history WHERE date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW() GROUP BY uid