-->

在MySQL查询没有得到正确的COUNT()(修改早些时候)(Not getting correct

2019-10-18 06:03发布

我有3个表命名

  1. com_event_schedules
  2. com_appointments
  3. com_event_schedules_com_appointment_c

其具有第一两个表之间的关系。

以下是表的字段

  1. com_event_schedules - 标识 - 名称 - schedule_date - - END_TIME - 删除
  2. com_appointments - 标识 - - 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对多

我理想中的结果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'

我很期待在结果是其被有身份的约会COUNT每个计划的ID“已完成”和COUNT应该是“0”,如果没有匹配。

但什么即时得到结果中谁是正在和状态完成,并计数1只接受预约时间表ID。

我有2时间表和每个我有3个约会。 外面一日时间表的一个约会是有状态=“已完成”

所以,我需要得到这样的

sch_id     app.status
1              1
2              0

Answer 1:

尝试这个:

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


Answer 2:

1)虽然在某些情况下也可以达到同样的效果,你想使用JOINS,而不是选择不加选择地从多个表。 什么类型的JOIN要使用取决于你的数据,你想用它做什么。 在下面我的例子中只需要使用LEFT连接。

有关详细信息,请参见: SQL左连接VS从线多个表?

2)其次,通过包括“在哪里app.status =‘完成’”你不包括用于检索未结束(只返回正数)的约会信息的可能性。 这就是为什么我们使用LEFT JOIN在这里,即使没有对连接条件“状态=完成”的比赛,我们将获得右侧空。

对于一个很好的视觉说明,请参阅: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

3)计数是一个聚集的功能,所以将只返回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

如果你不加入或聚集如此familliar,并希望看到它是如何工作的话,我会删除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'


文章来源: Not getting correct COUNT() in MySQL Query (Modified Earlier )