2010-08-18 13 views
0

Tableau schéma est mis en place quelque chose comme ceci:Besoin d'aide avec une requête MYSQL regroupement

userID  Points  timestamp 

1   40 
3   20 
1   10 
4   15 
3   5 

besoin d'être en mesure de présenter un rapport qui montre les éléments suivants:

Total Points Allocated for the Day (0 if none allocated), (nice to have) To what userID's the points were allocated to for that day 

J'ai essayé les éléments suivants et bien que vous pouvez voir est pas correct

SELECT uid, DATE(time_stamp) AS date, SUM(points) AS total_points 
FROM table 
GROUP BY date 

Répondre

2

en supposant que vous aviez des valeurs comme l'horodatage, et je vais utiliser la colonne na mes userid, points et TIME_STAMP et un nom de table des Points Utilisateurs:

SELECT userID, 
     sum(points), 
     date(timestamp) as date 
FROM userpoints 
GROUP BY userID, date(timestamp) 

Alors:

userID  Points  timestamp 

1   40   18-8-2010 12:00:00.000 
3   20   18-8-2010 12:00:00.000 
1   10   18-8-2010 12:00:00.000 
4   15   18-8-2010 12:00:00.000 
3   5   18-8-2010 12:00:00.000 

se traduirait par:

userid  points  date 
1   50   18-8-2010 
3   25   18-8-2010 
4   15   18-8-2010 

MISE À JOUR: raffiné pour UNIX Edition

SELECT userID, 
     sum(points), 
     from_unixtime(timestamp, 'DD-MM-YYYY') as date 
FROM userpoints 
GROUP BY userID, date(timestamp) 
+0

Les horodatages ne s'affichent pas correctement. Je veux dire que je vois beaucoup de NULLS et les dates sont fausses. Où cela devrait être quelque chose aujourd'hui, je vois 2012. – jini

+0

Qu'est-ce que vous utilisez pour remplir votre table? – XstreamINsanity

+0

L'horodatage est juste un horodatage unix. donc j'ai des valeurs comme 1256235850, 1256255246 qui reviennent comme NULL lorsque vous faites la date (timestamp) – jini

1
SELECT DATE(time_stamp) as date1, userID, SUM(Points) as total_points 
FROM table1 
GROUP BY date1, userID 
WITH ROLLUP 

Un enregistrement avec null userID et null null date1 montre combien de points ont été alloués à cette date, Un enregistrement avec null userID et null date1 - nombre total de points alloués.

+0

J'aime ce ROLLUP. Jamais vu/utilisé cela avant. Agréable. – XstreamINsanity

2

MySQL n'a pas de fonctionnalité récursive, il vous reste donc à utiliser l'astuce de la table NUMBERS pour obtenir une liste de jours afin de LEFT JOIN pour voir les jours où aucune relation n'est attribuée.

  1. Créer une table qui ne contient que le nombre incrémenter - facile à faire en utilisant un auto_increment:

    DROP TABLE IF EXISTS `example`.`numbers`; 
    CREATE TABLE `example`.`numbers` (
        `id` int(10) unsigned NOT NULL auto_increment, 
        PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
    
  2. Peupler la table en utilisant:

    INSERT INTO NUMBERS 
        (id) 
    VALUES 
        (NULL) 
    

    ... pour autant de valeurs Comme vous le souhaitez.

  3. Utilisez DATE_ADD pour construire une liste de fois, ce qui augmente les mois en fonction de la valeur NUMBERS.id:

    SELECT x.* 
        FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 DAY) 
          FROM numbers n) x 
    
  4. LEFT JOIN sur votre table de données en fonction de la partie datetime:

    SELECT up.userid, 
          COALESCE(SUM(up.points), 0) AS points 
          DATE(x.dt) AS date 
        FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 MONTH) AS dt 
          FROM numbers n) x 
    LEFT JOIN USERPOINTS up ON DATE(FROM_UNIXTIME(up.timestamp)) = DATE(x.dt) 
    GROUP BY up.userid, DATE(x.dt)