programing

두 테이블을 비교하고 경기를 건너뛰는 방법은 무엇입니까?

copyandpastes 2023. 6. 15. 23:04
반응형

두 테이블을 비교하고 경기를 건너뛰는 방법은 무엇입니까?

저는 사용자라는 테이블을 가지고 있습니다.

이 표에는 각 직원이 가지고 있는 내부 번호, 이름 및 출발 시간이 저장되어 있습니다.

num_html 이름. 출발.
1001 존. 13:00
1002 루시아 14:00

저는 레코드라는 테이블을 가지고 있습니다.

이 표에는 각 직원이 근무지를 떠난 날짜와 시간에 대한 기록이 보관되어 있습니다.

num_html 날짜.
1001 2022-02-01 13:01:00
1002 2022-02-01 14:01:00
1001 2022-02-02 12:30:00
1002 2022-02-02 13:56:00

저는 패스라는 테이블을 가지고 있습니다.

다음 표에는 공식 출발 시간 전에 퇴근할 수 있도록 직원에게 부여된 출입증이 기록되어 있습니다.

num_html 날짜.
1001 2022-02-02

저는 직원이 특정 달(2월)에 체크아웃 시간 전에 퇴근한 모든 시간을 표시하기 위해 다음 쿼리를 작성했습니다.

SELECT r.num_employee,
       u.name,
       DAY(r.date) AS day,
       CAST(r.date AS time) AS time
FROM users u
LEFT JOIN(SELECT num_employee, date FROM records) r ON r.num_employee = u.num_employee
WHERE date BETWEEN '2022-02-01' AND '2022-02-28'
GROUP BY num_employee, DATE(date)
HAVING time < SUBTIME(u.departure,'0:01')

이 쿼리는 직원 번호, 직원 이름 및 직원이 조기 퇴직한 2월의 날짜를 표시합니다.결과는 다음과 같습니다.

num_html 이름. 낮의
1001 존. 2
1002 루시아 2

또한 2월에 부여된 패스를 표시하기 위해 다음과 같은 질문이 있습니다.

SELECT p.num_employee,
       u.name,
       DAY(p.date) AS day
FROM users u
LEFT JOIN(SELECT num_employee, date FROM passes) p ON p.num_employee = u.num_employee
WHERE date BETWEEN '2022-02-01' AND '2022-02-28'
GROUP BY num_employee, DATE(date)

위의 쿼리는 다음 결과를 표시합니다.

num_html 이름. 낮의
1001 존. 2

제가 찾고 있는 것은 해고 시간 전에 퇴근해서 출입증이 없는 직원들을 데려오는 것입니다.위의 예를 들어보면 존만 출입증이 있으므로 출입증을 소지하지 않고 일찍 떠난 사람들의 결과로 나타나야 할 사람은 루시아입니다.원하는 결과는 다음과 같이 표시됩니다.

num_html 이름. 낮의
1002 루시아 2

제가 어떻게 그런 결과를 얻을 수 있을까요?저는 CTE를 지원하지 않는 버전으로 phpMyAdmin의 MariaDB와 함께 작업하고 있습니다.

디슬라이머, 저는 마리아Db를 많이 사용하지 않았습니다.궁극적으로 필요한 것은 추가 외부 조인입니다.passes직원 번호 및 날짜에 표시됩니다.그런 다음 패스 레코드가 일치하는 을 제외합니다.WHERE p.date IS NULL모든 그룹화 및 기타 필터가 없으면 기본 쿼리는 다음과 같습니다.

SELECT * 
FROM users u
        INNER JOIN records r ON r.num_employee = u.num_employee
        LEFT JOIN passes p ON p.num_employee = u.num_employee 
             AND p.date = DATE(r.Date)
WHERE  p.date IS NULL 

이 결과는 다음과 같습니다.

num_build | 이름 | 출발 | num_build | 날짜 | num_build | 날짜-----------: | :---- | :-------- | -----------: | :------------------ | -----------: | :---1001 | 존 | 13:00:00 | 1001 | 2022-02-01 13:01:00 | null | null1002 | 루시아 | 14:00:00 | 1002 | 2022-02-01 14:01:00 | null | null1002 | 루시아 | 14:00:00 | 1002 | 2022-02-02 13:56:00 | null | null

그런 다음 그룹화 및 날짜 필터를 다시 추가합니다.

SELECT r.num_employee,
       u.name,
       u.departure,
       DAY(r.date) AS day,
       CAST(r.date AS time) AS time
FROM users u
        INNER JOIN records r ON r.num_employee = u.num_employee
        LEFT JOIN passes p ON p.num_employee = u.num_employee 
             AND p.date = DATE(r.Date)
WHERE r.date >= '2022-02-01' 
AND   r.date < '2022-03-01'
AND   p.date IS NULL
GROUP BY r.num_employee, DATE(r.date)
HAVING time < SUBTIME(departure,'0:01')

결과:

num_num | 이름 | 출발 | 일 | 시간-----------: | :---- | :-------- | --: | :-------1002 | 루시아 | 14:00:00 | 2 | 13:56:00

원래 쿼리에 대한 몇 가지 참고 사항:

LEFT JOIN(num_join, date from records) r r.num_join = u.num_join(여기서 날짜는 '2021-02-01'과 '2021-02-28' 사이)

JOIN이 필요한 것은 , OUTER JOIN에 필터링이 필요하다는 바랍니다.records.dateWHERE 절은 암시적으로 JOIN을 INER JOIN으로 변환합니다.단지 주의할 점은...

날짜는 '2022-02-01'과 '2022-02-28' 사이입니다.

ㅠㅠdate날짜와 시간을 모두 포함하며, 해당 조항은 2022년 2월 28일에 대부분의 항목을 제외합니다.하세요.where date >= StartDateAtMidnight and < EndDateAtMidnight + 1 Day.

db<>여기로 이동

언급URL : https://stackoverflow.com/questions/71388124/how-to-compare-two-tables-and-skip-matches

반응형