MySQL查询两个不同的条件,用于1个查询中的不同计数

时间:2013-06-07 06:32:41

标签: php mysql sugarcrm

我有3个名为

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

    以下是表格的字段

    1. com_event_schedules - ID - 名称 - schedule_date - 开始时间 - 时间结束 - 已删除

    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)

    4. 表com_event_schedule和com_appointments之间的关系是1到很多

      我想要的结果是schedule_id,条件状态的约会总数='已完成'

      我尝试了以下查询:

      SELECT sch.id,COUNT(app.id) AS total,
        (SELECT COUNT(ap.id) 
        FROM 
        com_appointment ap, 
        com_event_schedules sc, 
        com_event_schedules_com_appointment_c re 
        WHERE 
        re.com_event_schedules_com_appointmentcom_event_schedules_ida=sc.id AND  
        ap.id=re.com_event_schedules_com_appointmentcom_appointment_idb AND 
        sc.deleted=0 AND 
        ap.status='completed') AS completed
      
      FROM 
      com_event_schedules sch,
      com_appointment app,
      com_event_schedules_com_appointment_c rel 
      WHERE 
      rel.com_event_schedules_com_appointmentcom_event_schedules_ida=sch.id AND
      app.id=rel.com_event_schedules_com_appointmentcom_appointment_idb AND 
      sch.deleted=0 GROUP BY sch.id
      

      使用此查询我获得准确的总计数但已完成的计数与预期不符。每个时间表显示1。但是,db中只有1个约会已完成,其他任务仍在等待中。

      查询有问题吗? 我在后端有SugarCRM。不能使用小提琴导致关系和字段太乱。

1 个答案:

答案 0 :(得分:1)

此查询应该可以帮助您。它所做的最重要的事情是计算所有约会总数,然后在IF状态=完成时计算SUM,以便在同一查询中获得总数和完成数。

SELECT
    sc.id,
    COUNT(ap.id) as total,
    SUM(IF(status = 'completed', 1, 0)) as completed
FROM
    com_event_schedules sc
LEFT JOIN
    com_event_schedules_com_appointment_c re
    ON re.com_event_schedules_com_appointmentcom_event_schedules_ida = sc.id
LEFT JOIN
    com_appointment ap
    ON re.com_event_schedules_com_appointmentcom_appointment_idb = ap.id
WHERE
    sc.deleted = 0
GROUP BY
    sc.id

另外,我注意到你说这是一对多的关系。像你这样的关系表真的是为了多对多。拥有一对多的最有效方法是摆脱com_event_schedules_com_appointment_c表并在com_event_schedule_id表中添加com_appointments