0

テーブルスキーマは次のように設定されます。

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
4

3 に答える 3

2

MySQLには再帰機能がないため、NUMBERSテーブルのトリックを使用して日数のリストを取得し、関係がゼロである日を確認するために参加を許可する必要があります。

  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)
    
于 2010-08-18T18:12:33.207 に答える
2

タイムスタンプとして値があると仮定すると、列名 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 の問題を修正

SELECT userID,
       sum(points),
       from_unixtime(timestamp, 'DD-MM-YYYY') as date
FROM   userpoints
GROUP BY userID, date(timestamp)
于 2010-08-18T17:58:38.957 に答える
1
SELECT DATE(time_stamp) as date1, userID, SUM(Points) as total_points
FROM table1
GROUP BY date1, userID
WITH ROLLUP

userID が null で date1 が null でないレコードは、その日付に割り当てられたポイント数を示します。userID が null で date1 が null のレコード - 割り当てられた合計ポイント。

于 2010-08-18T18:00:36.340 に答える