MySQL Group по сумме за день - PullRequest
3 голосов
/ 10 января 2012

У меня есть таблица с

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)

Это не дает правильных результатов. Они группируются в один ряд.

Дата сохраняется из формата дд / мм / гггг в метку времени Unix, например 1349046000

Ответы [ 3 ]

4 голосов
/ 10 января 2012
SELECT 
    DATE(FROM_UNIXTIME(created)) as d, 
    sum(amount) as amount
FROM total_log 
WHERE user_id = $this->user_id 
GROUP BY d
1 голос
/ 10 января 2012

1001 * попробовать *

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)))
1 голос
/ 10 января 2012

MySQL не любит смешивать day и int столбцы:

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, если для них не используется агрегирующая функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...