简体   繁体   English

MySQL用日期范围计数两个表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM