MySQL: запрос для выбора уникальных пациентов - PullRequest
0 голосов
/ 15 апреля 2020

Я застрял с запросом, не возвращающим уникальные записи.

У меня есть следующие таблицы:

clinics (id => PK)
patients (id => PK, clinic_id => FK)
patient_visits(id => PK, patient_id => FK, clinic_id => FK)

Пациент зарегистрирован в клинике c. Пациент может посетить любую клинику c любое количество раз. Я хочу вернуть всех уникальных пациентов, которые посетили клини c.

. Я попытался выполнить следующий запрос, который не возвращает уникальные записи для клини c

SELECT v.id
     , v.patient_id
     , v.clinic_id
     , c.name clinic_name
     , p.name
     , p.mobile
     , p.email
     , p.gender
     , p.created_at
     , last_visit_date
     , visit_count 
  FROM 
     ( SELECT DISTINCT patient_id
                     , clinic_id 
                  FROM patient_visits
     ) pat
  JOIN patient_visits v
    ON pat.patient_id = v.patient_id 
  JOIN clinics c
    ON c.id = v.clinic_id 
  JOIN patients p
    ON p.id = v.clinic_id 
  JOIN 
     ( SELECT patient_id
            , MAX(patient_visits.created_at) last_visit_date
            , COUNT(patient_visits.created_at) visit_count 
         FROM patient_visits 
        GROUP 
           BY patient_id
     ) visits_aggregate 
    ON visits_aggregate.patient_id = p.id 
 WHERE v.clinic_id = ? 
 ORDER 
    BY visit_date

One Я понимаю, что проблема, если я присоединюсь к Patient_Vitits, будет выбрана совпадающая повторяющаяся комбинация Patient_id, clinic_id.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вы должны воздерживаться от СОЕДИНЕНИЯ ко всем строкам в 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

Посмотрите, как это работает? Вам не нужны все посещения, просто их совокупность с указанием даты последнего посещения и количества.

0 голосов
/ 15 апреля 2020

Я не совсем понимаю ваш сложный запрос. Ваш запрос должен быть прямым:

select 
 pv.patient_id,
 pv.clinic_id,
 max(pv.visit) as last_visit,
 count(*) as visit_count
from 
 patient_visit pv,
 patients p
 -- You may now here join the other tables
where 
 pv.patients_id = p.id
 and pv.clinic_id = ?
group by
 pv.patient_id

Как я понимаю, использование вами различных находится во внутреннем выборе. И вы выбираете Patient_visit дважды, создавая набор мощности таблицы, получая все комбинации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...