1

我有 3 个表名为

  1. com_event_schedules
  2. com_appointments
  3. com_event_schedules_com_appointment_c

它在前两个表之间有关系。

以下是表格的字段

  1. com_event_schedules -- id -- name -- schedule_date -- start_time -- end_time -- 已删除
  2. com_appointments -- id -- start_time -- end_time -- 状态
  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.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”。

但是我得到的结果是只有日程安排ID,他的约会状态已完成且计数为1。

例如

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

所以我需要这样的结果

sch_id     app.status
1              1
2              0
4

2 回答 2

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
于 2013-06-07T08:01:23.273 回答
0

1)虽然在某些情况下你可以达到同样的结果,但你希望使用JOINS而不是不加选择地从多个表中选择。您要使用哪种类型的 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'
于 2013-06-07T07:57:32.330 回答