2012-01-09 14 views
2

によって私は金額フィールドを合計する日までにグループ化された行のリストを作成したいMySQLのグループ別合計デイ

id int pk auto_inc | created int(11) | amount int | user_id int 

を持つテーブルがあります。

私はこれを試してみました:

SELECT created, sum(amount) as amount, id FROM total_log WHERE user_id = $this->user_id GROUP BY DAY(created) 

これは、右の結果を与えるものではありません。彼らは1つの行にグループ化されています。

日付がdayint列混合好きではありません1349046000

+0

を試してみてください?あなたは 'どこのuser_id = $ this-> user_id'を持っています。これにより、結果セットがグループ化される前でも*前の行が1つしかないと思うようになります。 –

+0

user_idに言及するのを忘れました。いいえ、同じuser_idの複数のレコードがあります – iamjonesy

+0

Hm..それは適切なクエリですか?それはSQL Serverでイベントがコンパイルされませんでした。 Select節には、group by節で使用される「created」および「id」列への参照があります(day(created)は、それらの項で作成されたものとは異なります)。 – pkmiec

答えて

3
SELECT 
    DATE(FROM_UNIXTIME(created)) as d, 
    sum(amount) as amount 
FROM total_log 
WHERE user_id = $this->user_id 
GROUP BY d 
+0

これはすばらしいおかげです! – iamjonesy

+0

ようこそ – frail

1

のMySQLのようなUNIXタイムスタンプにDD/MM/yyyy形式から保存されますがありますので、あなたのすべての行を

mysql> select day(1349046000); 
+-----------------+ 
| day(1349046000) | 
+-----------------+ 
|   NULL | 
+-----------------+ 
1 row in set, 1 warning (0.00 sec) 

mysql> show warnings; 
+---------+------+----------------------------------------+ 
| Level | Code | Message        | 
+---------+------+----------------------------------------+ 
| Warning | 1292 | Incorrect datetime value: '1349046000' | 
+---------+------+----------------------------------------+ 
1 row in set (0.00 sec) 

NULLの場合はday(some_int_value)となり、すべて同じグループになります。

代わりにその列にdateまたはdatetimeタイプを使用することをお勧めします。

また、group by句に含まれていない列は、集約関数が使用されていない限り、selectステートメントでは参照しないでください。

1

は1行以上あるはずです

SELECT 
DAY(DATE(FROM_UNIXTIME(created))), 
sum(amount) as amount 
FROM total_log 
WHERE user_id = $this->user_id 
GROUP BY DAY(DATE(FROM_UNIXTIME(created)))