我有3个表命名
- com_event_schedules
- com_appointments
- com_event_schedules_com_appointment_c
其具有第一两个表之间的关系。
以下是表的字段
- com_event_schedules - 标识 - 名称 - schedule_date - - END_TIME - 删除
- com_appointments - 标识 - - END_TIME - 状态
- 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
尝试这个:
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
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'