在MySQL查询中没有得到正确的COUNT()(早期修改)

时间:2013-06-07 07:15:07

标签: php mysql sugarcrm

我有3个名为

的表
  1. com_event_schedules
  2. com_appointments
  3. com_event_schedules_com_appointment_c
  4. ,前两个表之间有关系。

    以下是表格的字段

    1. com_event_schedules - id - name - schedule_date - start_time - end_time - deleted
    2. com_appointments - id - start_time - end_time - status
    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)
    4. 表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 1的预约ID。

      例如

      我有2个时间表,每个我有3个约会。其中第一个时间表的一个约会状态='已完成'

      所以我需要像这样的结果

      sch_id     app.status
      1              1
      2              0
      

2 个答案:

答案 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'