2016-11-21 8 views
0

Я хочу найти количество зарегистрированных пользователей за определенный год, сгруппированные по месяцам. Ниже приведен запросMySQL Определенные пользователем переменные Возвращает неверный результат при использовании с COUNT

set @numberOfUsers := 0; 
SELECT month(from_unixtime(u.createdDate)) as month, count(u.id) as monthlyusers, 
(@numberOfUsers := @numberOfUsers + count(u.id)) as totalUsers 
FROM user u 
where year(from_unixtime(u.createdDate)) = '2016' 
group by month(from_unixtime(u.createdDate)); 

Однако, я не получаю правильный результат для totalUsers, не добавляя результат предыдущих строк.

month | monthlyUsers | totalUsers 
10  |  1  |  1 
11  |  3  |  3 

Значение totalUsers в 11-м месяце должно было быть 4. Не уверен, что в запросе неверно. Любая помощь?

ответ

1

Вы должны embeed своего GROUP BY запроса в подзапросе для вычисления бегового всего на окончательных результатах, а не в то время как на счет все еще «вычисляемые»:

set @numberOfUsers := 0; 
SELECT T.*, (@numberOfUsers := @numberOfUsers + T.monthlyusers) as totalUsers 
FROM 
(
    SELECT month(from_unixtime(u.createdDate)) as month, count(u.id) as monthlyusers 
    FROM user u 
    where year(from_unixtime(u.createdDate)) = '2016' 
    group by month(from_unixtime(u.createdDate)) 
) T; 
0

Прочитайте следующее: http://dev.mysql.com/doc/refman/5.7/en/user-variables.html

Для других операторов, таких как SELECT, вы можете получить ожидаемые результаты, но это не гарантируется. В следующем заявлении, вы можете подумать, что MySQL будет оценивать @a первый, а затем сделать задание второй:

Следующий код работает в качестве решения (работа с подзапросов):

SELECT month(from_unixtime(u.createdDate)) as month, 
     count(u.id) as monthlyusers, 
     (select count(*) from user USER where year(USER.createdDate)='2016' and month(USER.createdDate)<=month(u.createdDate)) as totalUsers 
FROM user u 
where year(from_unixtime(u.createdDate)) = '2016' 
group by month(from_unixtime(u.createdDate));