의사와 과거 약속이 포함 된 약속 데이터베이스가 있습니다. 사용자가 의사와의 약속을 잡으려고 할 때 레지던트를 선택하면 그 레지던트에 따라 의사에게 표시됩니다. 이제 까다로워지는 부분 :
의사는 과거 약속 순서대로 표시됩니다. 즉, 과거에 두 명의 심장 전문의를 방문했다면 마지막으로 예약 한 의사가 먼저 표시되고, 다른 한 명은 그다음에, 그 다음에는 모두 표시됩니다. 내가 약속 한 적이없는 심장 전문의.
이를 위해 심장 전문의와의 과거 약속을 찾아 날짜별로 내림차순으로 정렬 한 다음 모든 의사에게 가서 목록의 맨 아래에 다른 약속을 추가해야합니다.
이 쿼리를 시도하고 있습니다.
(
select distinct pastappointments.doctorID from pastappointments where
pastappointments.insuredID = 1 and pastappointments.residency='cardio'
order by pastappointments.appTime desc
)
union (
select employees.employeeID from employees where
employees.Residency='cardio' and employees.employeeID not in (
select distinct pastappointments.doctorID from pastappointments where
pastappointments.insuredID = 1 and pastappointments.residency='cardio'
))
내가 가진 문제는 주로 통합 명령 위의 첫 번째 쿼리를 실행할 때 괄호없이 올바른 순서를 얻습니다. 괄호가 쿼리 결과가 잘못된 것으로 변경되면.
MySQL을 사용하고 있습니다.
두 개의 다른 쿼리가 아닌 하나의 쿼리를 사용하여이 작업을 수행하고 싶지만 필요한 내림차순을 잃지 않고는 그렇게 할 방법을 찾을 수없는 것 같습니다.
특정 순서로 결과를 얻으려면 order by
가장 바깥 쪽 쿼리 에 지정해야 합니다.
MySQL은,이입니다 후union
. 중복을 제거하는 오버 헤드를 명시 적으로 원하지 않는 한 union all
대신을 강력히 권장 합니다 union
.
(select pa.doctorID, max(pa.appTime) as last_apptime
from pastappointments pa
where pa.insuredID = 1 and pa.residency = 'cardio'
group by pa.doctorID
) union all
(select e.employeeID, NULL as last_apptime
from employees e
where e.Residency = 'cardio' and
e.employeeID not in (select pa.doctorID
from pastappointments pa
where pa.insuredID = 1 and
pa.residency = 'cardio'
)
)
order by (last_apptime is not null) desc, last_apptime desc;
두 개의 열을 반환합니다. 하나의 열을 원하면 하위 쿼리를 사용하십시오.
select t.doctorID
from (<above query without orderby) t
order by (last_apptime is not null) desc, last_apptime desc;
또한 group by
첫 번째 쿼리에서의 사용에 주목해야 합니다. 이것은 정확한 마지막 약속 시간을 얻기 위해 필요합니다.
그리고 모든 의사가 직원이라고 가정하면 다음과 같이 훨씬 단순화 할 수 있습니다.
select e.employeeID
from employees e left join
(select pa.doctorID, max(apptime) as last_apptime
from pastappointments pa
where pa.insuredID = 1 and pa.residency = 'cardio'
group by pa.doctorId
) pa
on e.EmployeeId = pa.DoctorId
where e.Residency = 'cardio' -- or pa.doctorId is not null
order by (last_apptime is not null) desc, last_apptime;
이것은 또한한다고 가정 e.Residency
과 동일합니다 pa.residency
. 그렇지 않은 경우 or
조건이 필요합니다.
이것은 쿼리를 작성하는보다 합리적인 방법입니다 (모든 의사가 직원이라고 가정).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다