[英]Not getting correct COUNT() in MySQL Query (Modified Earlier )
我有3张桌子叫
前两个表之间有关系。
以下是表格的字段
表com_event_schedule和com_appointments之间的关系是1对多
我想要的结果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的计划ID。
例如
我有2个时间表,每个时间表有3个约会。 在第一个日程表的一个约会中,状态为“已完成”
所以我需要这样的结果
sch_id app.status
1 1
2 0
尝试这个:
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)尽管在某些情况下可以获得相同的结果,但是您想使用JOINS而不是随意选择FROM FROM table。 您要使用哪种JOIN类型取决于您拥有的数据以及要使用的数据。 在下面的示例中,我仅使用了LEFT JOINS。
有关更多信息,请参见: SQL左联接与FROM行上的多个表?
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个结果-除非您按列分组以返回该列的结果。 在这种情况下,您想返回每个计划的已完成约会的计数,因此您按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'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.