繁体   English   中英

在MySQL查询中未获得正确的COUNT()(已修改过)

[英]Not getting correct COUNT() in MySQL Query (Modified Earlier )

我有3张桌子叫

  1. com_event_schedules
  2. com_appointments
  3. com_event_schedules_com_appointment_c

前两个表之间有关系。

以下是表格的字段

  1. com_event_schedules-id-名称-schedule_date-start_time-end_time-已删除
  2. com_appointments-id-开始时间-结束时间-状态
  3. com_event_schedules_com_appointment_c-id-com_event_schedules_com_appointmentcom_event_schedules_ida(schedule_id)-com_event_schedules_com_appointmentcom_appointment_idb(appointment_id)

表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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM