Неправильное значение COUNT () в запросе MySQL (ранее изменено)

У меня есть 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 (destination_id)

отношение между таблицами com_event_schedule и com_appointments равно 1 для многих

То, что я хочу в result 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 назначений, которые имеют статус «завершен», а COUNT должен быть «0», если нет совпадения.

Но то, что я получаю в результате, – это только идентификатор расписания, у которого назначена встреча с завершенным статусом и COUNT 1.

например

У меня есть 2 графика, и для каждого у меня 3 встречи. Из одного назначенного 1-го графика статус = «завершен»,

Поэтому мне нужен результат, подобный этому

 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 вместо того, чтобы выбирать FROM из нескольких таблиц без разбора. Какой тип JOIN вы хотите использовать, зависит от ваших данных и того, что вы хотите с ним делать. В приведенном ниже примере я только что использовал LEFT JOINS.

Дополнительные сведения см. В разделе: SQL left join vs multiple tables в строке 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 результат – если вы не группируете столбец для возврата результатов 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 

Если вы не так знакомы с присоединением или агрегацией и хотите посмотреть, как это работает, я бы удалил части 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'