我有3个名为
的表,前两个表之间有关系。
以下是表格的字段
我想要的结果schedule_id,以及状态='已完成'的约会总数
我尝试了以下查询:
SELECT sch.id,COUNT(app.status)
FROM
com_event_schedules sch,
com_appointment app,
com_event_schedules_com_appointment_c rel
WHERE
sch.id=com_event_schedules_com_appointmentcom_event_schedules_ida AND
app.id=rel.com_event_schedules_com_appointmentcom_appointment_idb AND
app.status='completed'
我期待的结果是每个时间表的ID及其约会的COUNT个状态为“已完成”,如果没有匹配则COUNT应为“0”。
但是我得到的结果是只有预约身份已完成状态和COUNT 1的预约ID。
例如
我有2个时间表,每个我有3个约会。其中第一个时间表的一个约会状态='已完成'
所以我需要像这样的结果
sch_id app.status
1 1
2 0
答案 0 :(得分:2)
试试这个:
SELECT
sch.id,
SUM(IF(app.status = 'completed' , 1, 0))
FROM
com_event_schedules sch
INNER JOIN com_event_schedules_com_appointment_c rel
ON rel.com_event_schedules_com_appointmentcom_event_schedules_ida = sch.id
INNER JOIN com_appointment app
ON rel.com_event_schedules_com_appointmentcom_appointment_idb = app.id
GROUP BY
sch.id
HAVING
COUNT(*) > 1
答案 1 :(得分:0)
1)虽然在某些情况下您可以获得相同的结果,但您希望使用JOINS而不是不加选择地选择FROM多个表。您要使用哪种类型的JOIN取决于您拥有的数据以及您想要使用的数据。在下面的例子中,我刚刚使用了LEFT JOINS。
有关详情,请参阅:SQL left join vs multiple tables on FROM line?
2)其次,通过包括“where app.status ='completed'”,您将排除检索有关未完成约会的信息的可能性(仅返回正数)。这就是我们在这里使用LEFT JOIN的原因,即使连接条件没有匹配“status = completed”,我们也会在右侧获得NULL。
要获得精彩的视觉说明,请参阅:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
3)Count是一个聚合函数,因此只会返回1个结果 - 除非您按列分组以返回该列的结果PER。在这种情况下,您希望返回每个计划的已完成约会的计数,因此您可以按ID(sch.id)进行分组。
SELECT
sch.id,COUNT(app.status)
FROM
com_event_schedules sch
LEFT JOIN
com_event_schedules_com_appointment_c rel
ON
sch.id=rel.com_event_schedules_com_appointmentcom_event_schedules_ida
LEFT JOIN
com_appointments app
ON
app.id=rel.com_event_schedules_com_appointmentcom_event_schedules_idb=app.id
AND
app.status='completed'
GROUP BY
id
如果您不喜欢加入或聚合,并希望了解它是如何工作的,那么我将删除上述查询的GROUP BY和COUNT部分,并简单地查看非聚合结果集。它应该让事情变得更加清晰。
SELECT
sch.id,app.status
FROM
com_event_schedules sch
LEFT JOIN
com_event_schedules_com_appointment_c rel
ON
sch.id=rel.com_event_schedules_com_appointmentcom_event_schedules_ida
LEFT JOIN
com_appointments app
ON
app.id=rel.com_event_schedules_com_appointmentcom_event_schedules_idb=app.id
AND
app.status='completed'