【发布时间】:2017-11-20 18:44:24
【问题描述】:
我有 3 个名为
的表- com_event_schedules
- com_appointments
- com_event_schedules_com_appointment_c
在前两个表之间有关系。
以下是表格的字段
com_event_schedules - ID - 姓名 -- 日程安排日期 - 开始时间 - 时间结束 -- 删除
com_appointments - ID - 开始时间 - 时间结束 -- 状态
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作为子句添加到内部查询(或任何外部选择和内部查询之间的其他匹配)