[英]MySQL Count Two Tables with Dateranges
I have two tables with each of table having their same ID from the first time of Member Join. 我有两个表,从成员首次加入起,每个表的ID都相同。
Once the member has been Approved, he/she will be Rejected also for a some reason and condition. 一旦成员获得批准,出于某种原因和条件,他/她也将被拒绝。
The Query Result needs to sort by date ranges then counting total approves and total rejects based on each date from chosen ID. 查询结果需要按日期范围进行排序,然后根据所选ID中的每个日期计算批准和拒绝的总数。
In this case, I've selected for join_id 325. 在这种情况下,我选择了join_id 325。
Table approves: 表批准:
join_id approved_date
325 2016-03-20
326 2016-03-20
326 2016-03-20
325 2016-03-21
326 2016-03-21
325 2016-03-21
325 2016-03-21
327 2016-03-21
325 2016-03-22
327 2016-03-22
325 2016-03-22
Table rejects: 表拒绝:
join_id rejected_date
325 2016-03-20
325 2016-03-20
326 2016-03-20
325 2016-03-21
327 2016-03-21
325 2016-03-22
327 2016-03-22
325 2016-03-22
This is I've tried: 这是我尝试过的:
SELECT
approved_date,
COUNT(join_id) AS join_id
FROM approves
WHERE join_id = 325
AND approved_date BETWEEN '2016-03-19' AND '2016-03-26' + INTERVAL 1 DAY
GROUP BY DATE_FORMAT(approved_date, '%Y-%m-%d');
SELECT
rejected_date,
COUNT(join_id) AS join_id
FROM rejects
WHERE join_id = 325
AND rejected_date BETWEEN '2016-03-19' AND '2016-03-26' + INTERVAL 1 DAY
GROUP BY DATE_FORMAT(rejected_date, '%Y-%m-%d');
Results for join_id 325 I expected: 我预期的join_id 325结果为:
date_time|approves|rejected
2016-03-19|0|0
2016-03-20|1|2
2016-03-21|3|1
2016-03-22|2|2
2016-03-23|0|0
2016-03-24|0|0
2016-03-25|0|0
2016-03-26|0|0
select events.join_id, events.date, sum(approve) as approves, sum(reject) as rejects
from (
select join_id, approved_date as date, 1 as approve, 0 as reject from approves
union
select join_id, rejected_date as date, 0 as approve, 1 as reject from rejects
) as events
group by events.join_id, events.date
where events.join_id = ? -- Here you can have more complex condition
May not be very optimal but simplest I think. 我认为这可能不是最佳选择,但最简单。
Try this too 也尝试一下
select t1.join_id, t1.counting as approved, t2.counting as rejected from
(
select join_id, count(*) as counting from approves group by join_id
) as t1 inner join
(
select join_id, count(*) as counting from rejects group by join_id
) as t2 on t1.join_id=t2.join_id
Here's one way: 这是一种方法:
SELECT d,
COALESCE(approved_count, 0) AS approved_count,
COALESCE(rejected_count, 0) AS rejected_count
FROM (
SELECT DISTINCT approved_date AS d
FROM approves
UNION
SELECT DISTINCT rejected_date
FROM rejects) AS t1
LEFT JOIN (
SELECT approved_date, COUNT(*) AS approved_count
FROM approves
GROUP BY approved_date
) AS t2 ON t1.d = t2.approved_date
LEFT JOIN (
SELECT rejected_date, COUNT(*) AS rejected_count
FROM rejects
GROUP BY rejected_date
) AS t3 ON t1.d = t3.rejected_date
ORDER BY d
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.