Mysql : 选择每月总发生次数

Mysql : Selecting a monthly total occurence count

在MySQL中,我得到了一个table类似于:

id  user_id date
1   1       2014-09-27
2   1       2014-11-05
3   1       2014-11-14
4   2       2014-12-03
5   1       2014-12-23

我要select每月总人数

预期输出:4

2014-09 = 1 user
2014-10 = 0 user
2014-11 = 1 user //user 1 is present twice in november, but I want him only once per month
2014-12 = 2 user

total expected = 4

到目前为止,我的要求是:

SELECT count(id) 
FROM myTable u1 
WHERE EXISTS(
    SELECT id 
    FROM myTable u2 
    WHERE u2.user_id = u1.user_id
    AND DATE_SUB(u2.date, INTERVAL 1 MONTH) > u1.date
);

它输出了正确的数量,但在我的(不是那么重)table 上,它需要几个小时才能执行。有什么让这个更轻或更快的提示吗?

奖金:

由于 INTERVAL 1 MONTH 在 DQL 中不可用,有没有办法用 Doctrine QueryBuilder 来实现?

SELECT COUNT(DISTINCT user_id), YEAR(date) + '-' + MONTH(date)
FROM MyTable
GROUP BY YEAR(date), MONTH(date)

试试这个!

它应该能准确地满足您的需求...

        SELECT
          EXTRACT(YEAR FROM dates) AS the_year,
          EXTRACT(MONTH FROM dates) AS the_month,
          COUNT( DISTINCT user_id ) AS total
        FROM 
          myTable
        GROUP BY
          EXTRACT(YEAR FROM dates),
          EXTRACT(MONTH FROM dates);

对于你的问题,我会做的是:

  • 创建一个子请求,按月对不同的人数进行分组
  • 正在创建一个对子结果求和的请求。

这里是a working example (with your datas) sqlFiddle

请求如下:

SELECT SUM(nb_people)
FROM (
-- This request return the number of distinct people in one month.
SELECT count(distinct(user_id)) AS nb_people, MONTH(`date`), YEAR(`date`)
FROM test
GROUP BY MONTH(`date`)
) AS subQuery
;