Нужна помощь с группировкой запросов MYSQL - PullRequest
0 голосов
/ 18 августа 2010

Схема таблицы настроена примерно так:

userID      Points       timestamp

1           40
3           20
1           10
4           15
3           5

Необходимо иметь возможность представить отчет, который показывает следующее:

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

Я попробовал следующее, и, как вы видите, не правильно

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

Ответы [ 3 ]

2 голосов
/ 18 августа 2010

MySQL не имеет рекурсивной функциональности, поэтому вам остается использовать табличный трюк NUMBERS, чтобы получить список дней, чтобы LEFT JOIN против, чтобы увидеть дни, где приписаны нулевые отношения.

  1. Создать таблицу, содержащую только инкрементные числа - это легко сделать с помощью 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. Заполнить таблицу с помощью:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ... для столько значений, сколько вам нужно.

  3. Используйте DATE_ADD , чтобы составить список раз, увеличив месяцы на основе значения NUMBERS.id:

    SELECT x.*
      FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 DAY)
              FROM numbers n) x
    
  4. СЛЕВА ПРИСОЕДИНЯЙТЕСЬ к своей таблице данных на основе даты и времени:

       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)
    
2 голосов
/ 18 августа 2010

При условии, что у вас есть значения в качестве метки времени, и я буду использовать имена столбцов userid, points и time_stamp и имя таблицы userpoints:

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

Итак:

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

Результатом будет:

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

ОБНОВЛЕНИЕ: уточнено для UNIX Issue

SELECT userID,
       sum(points),
       from_unixtime(timestamp, 'DD-MM-YYYY') as date
FROM   userpoints
GROUP BY userID, date(timestamp)
1 голос
/ 18 августа 2010
SELECT DATE(time_stamp) as date1, userID, SUM(Points) as total_points
FROM table1
GROUP BY date1, userID
WITH ROLLUP

Запись с нулевым идентификатором пользователя и ненулевой датой1 показывает, сколько очков было выделено на эту дату, Запись с нулевым идентификатором пользователя и нулевой датой1 - общее количество баллов.

...