2016-07-06 2 views
1

У меня есть две таблицы:записей граф из разных таблиц в день

reports: 
    date, uuid 
warns: 
    date, uuid, active 

Где date отметка времени (2016-05-16 16:06:58), uuid является строка идентификатора пользователя и active является булевым.

Я хочу показать, сколько reports и warns записей есть в день. На данный момент у меня есть этот запрос:

SELECT DATE(date) Date, count(*) Reports 
FROM reports 
GROUP BY DATE(date) 
ORDER BY DATE(date) DESC 

который отображает таблицу, как это:

Date  | Reports 
-----------+--------- 
2016-07-05 | 192  
2016-07-04 | 230  
2016-07-03 | 227  

Но я также хочу присоединиться к сколько warns записей произошло в тот день, но только если это active столбец TRUE, поэтому я хочу, чтобы запрос, чтобы вернуть таблицу, как это:

Date  | Reports | Warns 
-----------+---------+------- 
2016-07-05 | 192  | 47 
2016-07-04 | 230  | 59 
2016-07-03 | 227  | 56 

Я новичок в MYSQL, так что я не мог понять, как Я бы сделал это еще. Я немного искал JOINS и UNIONS, но не знал, как и как они применимы к моему делу. Любая помощь будет оценена по достоинству.

ответ

0

Вы можете использовать коррелировать запрос:

SELECT DATE(reports.date) Date, count(*) Reports, 
     (SELECT COUNT(*) FROM warns 
     WHERE DATE(warns.date) = DATE(reports.date) and warns.active = 'TRUE') as warns_cnt 
FROM reports 
GROUP BY DATE(reports.date) 
ORDER BY DATE(reports.date) DESC 
0

Чтобы проиллюстрировать объединение вы могли: -

/* 
CREATE TEMPORARY TABLE REPORTS (DTE DATE, UUID INT); 
TRUNCATE TABLE REPORTS; 
INSERT INTO REPORTS VALUES 
('2016-07-05' , 192 ), 
('2016-07-05' , 192 ), 
('2016-07-05' , 192 ), 
('2016-07-04' , 230 ), 
('2016-07-04' , 230 ), 
('2016-07-03' , 227 ), 
('2016-07-02' , 227 ); 

DROP TABLE WARNS; 
CREATE TEMPORARY TABLE WARNS (DTE DATE, UUID INT,ACTIVE INT); 
INSERT INTO WARNS VALUES 
('2016-07-05'  , 47,0), 
('2016-07-05'  , 47,1), 
('2016-07-05'  , 47,1), 
('2016-07-04'  , 59,0), 
('2016-07-03'  , 56,1), 
('2016-07-03'  , 56,1), 
('2016-07-03'  , 56,1); 
*/ 


SELECT S.DTE, SUM(S.REPORTS) REPORTS, SUM(S.WARNS) WARNS 
FROM   
(
SELECT DTE,1 AS REPORTS, 0 AS WARNS FROM REPORTS 
UNION ALL 
SELECT DTE,0, 1 FROM WARNS WHERE ACTIVE = TRUE 
) S 
GROUP BY S.DTE 

Запрос создавать отчеты и ПРЕДУПРЕЖДАЕТ столбцов подзапроса, которые затем суммируются вне подзапроса.

Смежные вопросы