2017-11-01 1 views
0

안녕하세요, 모든 4 명의 사용자에 대해 지난 14 일 동안의 상태 데이터를 반환하는 SQL 문을 만들려고합니다. LEFT JOIN을 수행 할 목적으로 Calendar 테이블을 만들었습니다. 는 BackupData 표 주어 :Mysql 데이터가없는 요일에 왼쪽으로 가입

+----------+-------------+------------+-----------+------------------- 
--+ 
| customer | Category | user  | status | Date     
| 
+----------+-------------+------------+-----------+---------------------+ 
| acme  | Workstation | Judi  | [Success] | 2017-10-18 10:29:08 | 
| acme  | Server  | Quickbooks | [Success] | 2017-10-18 11:25:33 | 
| acme  | Server  | Quickbooks | [Success] | 2017-10-18 11:33:56 | 
| acme  | Workstation | Reception | [Success] | 2017-10-18 12:14:49 | 
| acme  | Workstation | Megan  | [Success] | 2017-10-18 16:10:24 | 
| acme  | Workstation | Judi  | [Success] | 2017-10-18 16:11:03 | 
| acme  | Workstation | Reception | [Success] | 2017-10-19 08:04:15 | 
| acme  | Server  | Quickbooks | [Success] | 2017-10-19 11:35:47 | 
| acme  | Workstation | Judi  | [Success] | 2017-10-19 16:10:13 | 
| acme  | Workstation | Reception | [Success] | 2017-10-20 08:35:26 | 
| acme  | Server  | Quickbooks | [Success] | 2017-10-20 13:28:08 | 
| acme  | Workstation | Judi  | [Success] | 2017-10-20 16:09:00 | 
| acme  | Server  | Quickbooks | [Success] | 2017-10-21 11:33:28 | 
| acme  | Workstation | Judi  | [Success] | 2017-10-21 16:11:01 | 
| acme  | Server  | Quickbooks | [Success] | 2017-10-22 11:33:16 | 
+----------+-------------+------------+-----------+---------------------+ 

은이 같은 데이터를 표시 할 없음 데이터

+------------+------------+-----------+ 
| dt   | User  | Status | 
+------------+------------+-----------+ 
| 2017-10-18 | Judi  | [Success] | 
| 2017-10-18 | Megan  | [Success] | 
| 2017-10-18 | Quickbooks | [Success] | 
| 2017-10-18 | Reception | [Success] | 
| 2017-10-19 | Judi  | [Success] | 
| 2017-10-19 | Quickbooks | [Success] | 
| 2017-10-19 | Reception | [Success] | 
| 2017-10-19 | Megan  | No Data | 
| 2017-10-20 | Judi  | [Success] | 
| 2017-10-20 | Quickbooks | [Success] | 
| 2017-10-20 | Reception | [Success] | 
| 2017-10-20 | Megan  | No Data | 
| 2017-10-21 | Judi  | [Success] | 
| 2017-10-21 | Quickbooks | [Success] | 
| 2017-10-21 | Megan  | No Data | 
| 2017-10-21 | Reception | [Success] | 
| 2017-10-22 | Judi  | [Success] | 
| 2017-10-22 | Quickbooks | [Success] | 
| 2017-10-22 | Megan  | No Data | 
| 2017-10-22 | Reception | No Data | 
| 2017-10-23 | Judi  | [Success] | 
| 2017-10-23 | Reception | [Success] | 
| 2017-10-23 | Quickbooks | No Data | 
| 2017-10-23 | Megan  | No Data | 

데이즈가 사용자 "NO DATA"로 표시한다. 내가 변경하는 경우

+------------+------------+-----------+ 
| dt   | User  | Status | 
+------------+------------+-----------+ 
| 2017-10-18 | Judi  | [Success] | 
| 2017-10-18 | Megan  | [Success] | 
| 2017-10-18 | Quickbooks | [Success] | 
| 2017-10-18 | Reception | [Success] | 
| 2017-10-19 | Judi  | [Success] | 
| 2017-10-19 | Quickbooks | [Success] | 
| 2017-10-19 | Reception | [Success] | 
| 2017-10-20 | Judi  | [Success] | 
| 2017-10-20 | Quickbooks | [Success] | 
| 2017-10-20 | Reception | [Success] | 
| 2017-10-21 | Judi  | [Success] | 
| 2017-10-21 | Quickbooks | [Success] | 
| 2017-10-22 | Judi  | [Success] | 
| 2017-10-22 | Quickbooks | [Success] | 
| 2017-10-23 | Judi  | [Success] | 
| 2017-10-23 | Reception | [Success] | 
| 2017-10-24 | Judi  | [Success] | 
| 2017-10-24 | Megan  | [Failed] | 
| 2017-10-24 | Quickbooks | [Success] | 
| 2017-10-25 | Judi  | [Success] | 
| 2017-10-25 | Megan  | [Success] | 
| 2017-10-25 | Quickbooks | [Success] | 
| 2017-10-25 | Reception | [Success] | 
| 2017-10-26 | Judi  | [Success] | 
| 2017-10-26 | Megan  | [Success] | 
| 2017-10-26 | Quickbooks | [Success] | 
| 2017-10-26 | Reception | [Success] | 
| 2017-10-27 | Judi  | [Success] | 
| 2017-10-27 | Quickbooks | [Success] | 
| 2017-10-27 | Reception | [Success] | 
| 2017-10-28 | Judi  | [Success] | 
| 2017-10-28 | Quickbooks | [Success] | 
| 2017-10-29 | Judi  | [Success] | 
| 2017-10-29 | Quickbooks | [Success] | 
| 2017-10-30 | Judi  | [Success] | 
| 2017-10-30 | Megan  | [Success] | 
| 2017-10-30 | Quickbooks | [Success] | 
| 2017-10-30 | Reception | [Success] | 
| 2017-10-31 | Megan  | [Success] | 
| 2017-10-31 | Reception | [Success] | 
| 2017-11-01 | NULL  | NULL  | 
+------------+------------+-----------+ 

:에

SELECT calendar_table.dt,BackupDetail.User, BackupDetail.Status 
FROM calendar_table 
LEFT JOIN BackupDetail ON (calendar_table.dt = 
DATE(BackupDetail.Date)) 
where calendar_table.dt BETWEEN date_add(curdate(), interval -14 day) 
AND curdate() 
GROUP BY calendar_table.dt,BackupDetail.User 

결과 : 다른 사용자가 해당 일에 대한 데이터를 가질 수 있으므로 나의 현재 쿼리는 특정 사용자가 특정 일에 대한 상태 데이터가없는 null 값을 제거한다 쿼리에서 특정 사용자를 조회하기 위해 가입 :

SELECT calendar_table.dt,BackupDetail.User, BackupDetail.Status 
FROM calendar_table 
LEFT JOIN BackupDetail ON (calendar_table.dt = 
DATE(BackupDetail.Date) and BackupDetail.User = 'Quickbooks') 

where calendar_table.dt BETWEEN date_add(curdate(), interval -14 day) 
AND curdate() 

GROUP BY calendar_table.dt,BackupDetail.User 

내가 원하는 결과에 가까이 :

+------------+------------+-----------+ 
| dt   | User  | Status | 
+------------+------------+-----------+ 
| 2017-10-18 | Quickbooks | [Success] | 
| 2017-10-19 | Quickbooks | [Success] | 
| 2017-10-20 | Quickbooks | [Success] | 
| 2017-10-21 | Quickbooks | [Success] | 
| 2017-10-22 | Quickbooks | [Success] | 
| 2017-10-23 | NULL  | NULL  | 
| 2017-10-24 | Quickbooks | [Success] | 
| 2017-10-25 | Quickbooks | [Success] | 
| 2017-10-26 | Quickbooks | [Success] | 
| 2017-10-27 | Quickbooks | [Success] | 
| 2017-10-28 | Quickbooks | [Success] | 
| 2017-10-29 | Quickbooks | [Success] | 
| 2017-10-30 | Quickbooks | [Success] | 
| 2017-10-31 | NULL  | NULL  | 
| 2017-11-01 | NULL  | NULL  | 
+------------+------------+-----------+ 

결과를 첫 번째 테이블과 비교하면 23 번째와 31 번째 항목이 null이므로 결과에서 제거 된 것을 볼 수 있습니다.

기타 프로 시저 또는 공용체 문을 만드는 것. 가장 우아한 해결책은 무엇입니까?

감사합니다.

+2

응용 프로그램 코드에서 누락 날짜 처리. 그리고 집계 함수가없는 쿼리에는 GROUP BY 절이 포함되지 않아야합니다. 무의미한 결과 세트를 반환하는 확실한 방법입니다. – Strawberry

+0

잘 카운트, 동일한 결과를 추가 할 수 있습니다 ... –

+0

예. 아직도 무의미한! – Strawberry

답변

0

의 첫 번째 날짜하자 :

select dt 
from calendar_table 
where dt between date_add(curdate(), interval -14 day) and curdate(); 

그런 다음 사용자 :

select distinct user from backupdetail; 

당신은 당신이 대신 그 테이블에서 사용자를 선택 것 (당신이해야 같은) 사용자 테이블이있는 경우 당연하지. 그런 다음

의 하루와 사용자 당 상태를하자 : 이제

select distinct user, date, status 
from backupdetail 
where status = 'Success'; 

:

select user, date, group_concat(distinct status order by status) as statuses 
from backupdetail 
group by user, date; 

당신이 상태 = '성공'에만 관심이 있다면, 당신은 물론이 단순한를 만들 수 있습니다 가입 : 먼저 날짜와 사용자의 모든 조합 (CROSS JOIN)을 생성 한 다음 기존 백업 상세 레코드를 외부에 가입시킵니다.

SELECT 
c.dt, 
u.user, 
COALESCE(b.status, 'NO DATA') as status 
FROM 
(
    select dt 
    from calendar_table 
    where dt between date_add(curdate(), interval -14 day) and curdate() 
) c 
CROSS JOIN (select distinct user from backupdetail) u 
LEFT JOIN 
(
    select distinct user, date, status 
    from backupdetail 
    where status = 'Success' 
) b ON b.user = u.user AND date(b.date) = c.dt 
ORDER BY c.dt, u.user; 
+0

브릴리언트 감사 Thorsten. –