2013-03-14 61 views
0

我有2个表,一个叫Doctor,一个叫Appointment。他们都有doctor_id共同的关系。我需要能够生成一个医生ID列表以及为每位医生预约的数量为零或多个约会(请参阅图片表内容) enter image description hereMySQL - 加入2个表以返回零结果

使用下面的代码我可以列出医生)身份证以及预约的次数,但不会显示与医生列表中的ZERO Appointment相同的医生。我需要做什么修改?

SELECT doctor_id, COUNT(DISTINCT appt_time) AS No_APP FROM appointment GROUP BY doctor_id; 

这是我从它那里得到

enter image description here

回答

5

尝试:

SELECT doctor.doctor_id, COUNT(appointment.appt_time) AS No_APP 
FROM doctor 
LEFT JOIN appointment 
ON appointment.doctor_id = doctor.doctor_id 
GROUP BY doctor.doctor_id; 
+0

+1,但我认为,在计数DISTINCT是没用的。 – 2013-03-14 15:29:43

+0

@RaphaëlAlthaus你是对的,我删除了DISTINCT。 – criticalfix 2013-03-14 15:31:44

+0

DISTINCT实际上会导致IMO错误的结果。在不同的日子里,相同的预约时间呢? – Ejzy 2013-03-14 15:32:15

0

这应该工作:

select 
    d.doctor_id 
    ,count(distinct a.appt_time) as No_APP 
from doctor d 
left join appointment a on d.doctor_id=a.doctor_id 
group by d.doctor_id 
+0

这个工作呢!谢谢! – AbarthGT 2013-03-14 15:34:29

+0

尽管你应该删除“不同的”,正如ejzy对另一个答案的评论所指出的那样,它会(理论上)在不同的日子为相同的约会时间给出错误的答案。在现实生活中可能不会发生,但最好保持逻辑清洁。 – criticalfix 2013-03-14 15:47:53

+0

真..我从来没有用日期分割成日期和时间..所以当我看到原来的代码,我没有质疑.. – 2013-03-14 15:57:10

0

使用左连接:

SELECT doctor.doctor_id, COUNT(DISTINCT appt_date, appt_time) AS No_APP 
FROM doctor 
LEFT JOIN appointment 
ON doctor.doctor_id = appointment.doctor_id 
GROUP BY doctor_id; 
+0

这是行不通的。 – AbarthGT 2013-03-14 15:34:55

+0

固定。谢谢。我还将appt_date添加到“distinct”列的列表中。我认为这更符合你想要的。 – aingram 2013-03-21 18:03:35

1

使用左连接:

SELECT doctor.doctor_id, COUNT(appt_time) AS No_APP FROM doctor LEFT JOIN appointment ON doctor.doctor_id = appointment.doctor_id GROUP BY doctor.doctor_id; 

它应该做的伎俩

+0

这个工作以及谢谢! – AbarthGT 2013-03-14 15:35:20