我有两张桌子医生和预约。我需要制作一份医生ID列表,其中包含为每位医生预约的一次或多次预约。
到目前为止,我有但我无法弄清楚如何让它做我想做的事情:
SELECT
doctor.doctor_id,
appointment.doctor_id
FROM doctor,
appointment
WHERE doctor.doctor_id = appointment.doctor_id;
SELECT
COUNT(DISTINCT doctor_id) AS NumberOfAppointments
FROM appointment
where doctor_id="50";
任何帮助都将不胜感激,谢谢。
答案 0 :(得分:2)
JOIN
两个表和使用GROUP BY
SELECT doctor.doctor_id,
appointment.doctor_id,
COUNT(doctor_id) AS NumberOfAppointments
FROM doctor
LEFT JOIN appointment ON doctor.doctor_id = appointment.doctor_id GROUP BY doctor_id;
答案 1 :(得分:0)
要获取doctor_id
表中至少出现一次的appointments
值列表,其中包含出现在appointments
表格中的该doctor_id的行数,您可以使用这样的查询:
SELECT a.doctor_id AS doctor_id
, SUM(1) AS count_appointments
FROM appointments a
GROUP BY a.doctor_id
获得结果的关键是添加GROUP BY doctor_id
子句,它有效地将给定值doctor_id
的所有行折叠成一行,因此我们返回一个不同的列表of doctor_id。
聚合函数SUM(1)
基本上为每行返回1的文字值,然后将每行中的所有值与相同的doctor_id相加,实际上为我们计算了行数doctor_id
。
注意:您也可以使用COUNT(1)
或COUNT(*)
代替SUM(1)
,这些将返回相同的结果。您可以使用COUNT(expr)
,其中expr
是任何表达式,对于要包含在" count"中的每一行,计算结果为非NULL值。
要返回没有约会的doctor_id,我们使用doctors
表作为外连接操作的驱动表(假设doctor_id在医生表中是唯一的。)
这样的事情:
SELECT d.doctor_id AS doctor_id
, COUNT(a.doctor_id) AS count_appointments
FROM doctors d
LEFT
JOIN appointments a
ON a.doctor_id = d.doctor_id
GROUP BY d.doctor_id
同样,GROUP BY
将具有相同doctor_id
值的所有行折叠为一行,并且COUNT()聚合对该组进行操作。我们在COUNT()函数中使用的表达式需要是约会表中每个匹配行不为NULL的表达式,对于没有匹配行的医生的行,该表达式为NULL。
答案 2 :(得分:-1)
SELECT
doctor.doctor_id,
count(appointment.doctor_id)
FROM doctor,
appointment
WHERE doctor.doctor_id = appointment.doctor_id group by doctor.doctor_id;
您可以使用分组条款......