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
;
在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
;