Questa domanda dovrebbe essere in grado di aiutarti. La cosa più importante che fa è contare TUTTI gli appuntamenti per il totale e quindi SOMMA su uno stato SE =completato per ottenere sia il totale che il completato nella stessa query.
SELECT
sc.id,
COUNT(ap.id) as total,
SUM(IF(status = 'completed', 1, 0)) as completed
FROM
com_event_schedules sc
LEFT JOIN
com_event_schedules_com_appointment_c re
ON re.com_event_schedules_com_appointmentcom_event_schedules_ida = sc.id
LEFT JOIN
com_appointment ap
ON re.com_event_schedules_com_appointmentcom_appointment_idb = ap.id
WHERE
sc.deleted = 0
GROUP BY
sc.id
Inoltre, stavo notando che hai detto che era una relazione uno a molti. I tavoli relazionali come quelli che hai sono davvero per molti a molti. Il modo più efficiente per avere uno a molti è sbarazzarsi di com_event_schedules_com_appointment_c
tabella e aggiungi un com_event_schedule_id
agli com_appointments
tabella.