2016-04-11 2 views
1

У меня есть две таблицы, каждая из которых имеет один и тот же идентификатор с первого момента членства.MySQL Count Two Tables with Dateranges

Как только член будет одобрен, он будет отклонен также по какой-либо причине и условию.

Результат запроса должен сортировать по диапазонам дат, а затем подсчитывать общее количество утверждений и общее отклонение на основе каждой даты из выбранного идентификатора.

В этом случае, я выбрал для join_id 325.

Таблица утверждает:

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 

Таблица отвергает:

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 

Это я пробовал:

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'); 

Результаты для join_id я ожидал:

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 
+0

дайте нам знать ..what вы пробовали –

+0

@Jordan Я поставил код, я просто попробовал. Пожалуйста ознакомтесь. – cocksparrer

ответ

1
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 

Может быть не очень оптимальным, но я думаю, что самый простой.

0

Вот один из способов:

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 
+0

это более близко я думаю. Но все же не явился, как я предполагаю. Но спасибо. – cocksparrer

1

Попробуйте это слишком

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 
+0

где дата ?? –