Вы должны воздерживаться от СОЕДИНЕНИЯ ко всем строкам в patients_visits
, так как это вызовет пресловутый комбинаторный взрыв, приводящий к дублированию строк. Вам нужен агрегат.
Но, ваш пример показал patient_visits.id
. Если вам не нужны дубликаты в наборе результатов для каждого посещения, вы не можете показать этот столбец; он имеет разные значения для каждого посещения.
Вам нужен агрегат из таблицы Patient_visits, например:
SELECT patient_id, clinic_id,
MAX(created_at) last_visit_date,
COUNT(*) visit_count
FROM patient_visits
GROUP BY patient_id, clinic_id
Этот запрос содержит одну строку для каждой комбинации пациента и клини c , так что вы можете присоединить его к другим таблицам без генерации повторяющихся строк. Прежде чем сделать это, запустите его отдельно, чтобы убедиться, что он работает правильно.
Затем ... используйте его в своем запросе, как этот
select patients.id patient_id, clinics.id clinic_id,
clinics.name as clinic_name,
patients.name, patients.mobile, patients.email, patients.gender,
patients.created_at,
pv.last_visit_date, pv.visit_count
from patients
join ( SELECT patient_id, clinic_id,
MAX(created_at) last_visit_date,
COUNT(*) visit_count
FROM patient_visits
GROUP BY patient_id, clinic_id
) pv ON patients.id = pv.patient_id
join clinics ON pv.clinic_id = clinics.id
order by pv.last_visit_date
Посмотрите, как это работает? Вам не нужны все посещения, просто их совокупность с указанием даты последнего посещения и количества.