【问题标题】:MySQL Query two different conditions for different count in 1 queryMySQL在1个查询中查询不同计数的两个不同条件
【发布时间】:2017-11-20 18:44:24
【问题描述】:

我有 3 个名为

的表
  1. com_event_schedules
  2. com_appointments
  3. com_event_schedules_com_appointment_c

在前两个表之间有关系。

以下是表格的字段

  1. com_event_schedules - ID - 姓名 -- 日程安排日期 - 开始时间 - 时间结束 -- 删除

  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 到 Many

我想要的结果有 schedule_id,以及在条件 status='completed' 下的约会总数

我尝试了以下查询:

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。不能使用小提琴,因为关系和字段太乱了。

【问题讨论】:

  • 您应该对GROUP BY 进行更深入的了解——这不仅会使您的子选择无效,而且更加优雅。对于您的问题,您很可能需要将内部选择中的 com_event_schedules sc 与外部选择中的 com_event_schedules sch 匹配
  • @ Najzero :我尝试不使用 GROUP BY,但没有给出正确的总数。
  • 如果你有一对多的关系,你不需要为这个关系创建另一个表。直接将第一个表的主键('one'端)作为外键放入第二个表('many'端)。
  • @Bere:我希望我可以选择。它在后端自动创建表结构的 SugarCRM。我不知道为什么我的公司甚至使用它。
  • 正如之前评论过的一样,但再次明确地说:您的子查询与您的“外部”查询没有任何联系,很可能将另一个 AND sc.id = sch.id 作为子句添加到内部查询(或任何外部选择和内部查询之间的其他匹配)

标签: php mysql sugarcrm


【解决方案1】:

这个查询应该能帮到你。它所做的最重要的事情是计算所有约会的总数,然后对 IF 状态 = 完成求和,以便在同一个查询中获得总数和完成。

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 表中。

【讨论】:

    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 2021-05-21
    • 2012-02-18
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多