안녕하세요, 모든 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이므로 결과에서 제거 된 것을 볼 수 있습니다.
기타 프로 시저 또는 공용체 문을 만드는 것. 가장 우아한 해결책은 무엇입니까?
감사합니다.
응용 프로그램 코드에서 누락 날짜 처리. 그리고 집계 함수가없는 쿼리에는 GROUP BY 절이 포함되지 않아야합니다. 무의미한 결과 세트를 반환하는 확실한 방법입니다. – Strawberry
잘 카운트, 동일한 결과를 추가 할 수 있습니다 ... –
예. 아직도 무의미한! – Strawberry