Использование выбора из другого выбора в MySQL

0

У меня есть следующий запрос, в котором у меня будет, наконец, 205 идентификаторов пациентов для работы с:

select 
    patient_id
FROM
    visit
WHERE
    month(visit.date_of_visit)=3 
    AND 
    year(visit.date_of_visit)=2018
    AND
    visit.visit_status='Active'
GROUP BY patient_id

Я хочу получить все 205 идентификаторов и запустить их в другой запрос, чтобы узнать, сколько заболеваний у нас есть как сердечно-сосудистые, а затем как респираторные заболевания.

Моя структура базы данных выглядит следующим образом:

Изображение 174551

Я хочу, чтобы получить для каждого пациента идентификатор, что они были диагностированы ТОЛЬКО их первый визит в больницу (так что здесь мы будем работать с min(visit.date_of_visit))

Желаемый результат для 'diagn_name LIKE'% Cardio% ':

Например,>:

Пациенты: 150 (или что-то)

И запрос изменен, чтобы получить информацию о дыхании.

Я пробовал следующее для болезней кардио, где я использую select from select:

SELECT count(*)
FROM 
(
select 
    min(visit.date_of_visit), visit_id, patient_id, count(*) as patientId
FROM
    visit
WHERE
    month(visit.date_of_visit)=3 
    AND 
    year(visit.date_of_visit)=2018
    AND
    visit.visit_status='Active'
GROUP BY patient_id
) as vid
LEFT JOIN
consultation ON consultation.visit_id=vid.visit_id
LEFT JOIN
diagnosis ON diagnosis.diagnosis_id=consultation.diagnosis_id
WHERE  diagnosis.diagnosis_name LIKE '%Cardio%'

В результате получилось: 5 что является неправильным числом.

Это можно сделать легко с PHP и MYSQL вместе, но это исчерпает сервер, повторяя тот же запрос в 205 раз и увеличивая счетчик. Таким образом, желаемый результат должен выполняться только с MySQL.

Пример данных:

Посетите таблицу

visit_id = 1; date_of_visit = 2018-03-03; visit_reason = Активный;...; patient_id = 1234;

visit_id = 2; date_of_visit = 2018-03-04; visit_reason = Активный;...; patient_id = 1239;

visit_id = 3; date_of_visit = 2018-03-07; visit_reason = Активный;...; patient_id = 1234;

Консультационная таблица

consultation_id = 1;...; diagnosis_id = 12; visit_id = 1;...;

consultation_id = 2;...; diagnosis_id = 12; visit_id = 2;...;

Диагностическая таблица

diagnosis_id = 12; diagn_name: гипертония (сердечно-сосудистая болезнь);

diagnosis_id = 13; diagn_name: почечная болезнь

Запустив запрос, чтобы увидеть пациентов, которые пришли в больницу, и что у них был диагностирован сердечно-сосудистые заболевания при их первом первом посещении, результат должен быть в примере как 2, как вы можете видеть из примера, где patient_id = 1234 имел 2 посещения, но Мне нужно знать, что у него было в его первом.

  • 0
    Вы хотите добавить образцы данных (в виде текста) к своему вопросу?
  • 0
    Да. Просто дай мне несколько минут.
Показать ещё 5 комментариев
Теги:
mysql-workbench

2 ответа

0

Вы можете использовать функции окна в MySQL 8+. Но в более старых версиях вам нужно вычислить значение другим способом.

Вопрос для вас - это то, что вы считаете:

SELECT COUNT(*) as num_diagnoses, COUNT(DISTINCT patient_id) as num_patients
FROM visit v JOIN
     (SELECT patient_id,
             MIN(v.date_of_visit) as min_dov
      FROM visit v
      WHERE v.date_of_visit >= '2018-03-01' AND
            v.date_of_visit < '2018-04-01' AND
            v.visit_status = 'Active'
     ) vf
     ON v.patient_id = vf.patient_id AND v.date_of_visit = vf.min_dov JOIN
     consultation c
     ON c.visit_id = v.visit_id JOIN
     diagnosis d
     ON d.diagnosis_id = c.diagnosis_id
WHERE d.diagnosis_name LIKE '%Cardio%';

При работе с датами лучше сравнивать значения столбцов непосредственно с датами, а не анализировать их.

0

BRO, он отлично работает. Протестируйте его сейчас в реальном сценарии.

SELECT count(*)
FROM 
(
    select 
        min(visit.date_of_visit) first_date,  patient_id, count(*) as patientId
    FROM
        visit
    WHERE
        month(visit.date_of_visit)=3 
        AND 
        year(visit.date_of_visit)=2018
        AND
        visit.visit_status='Active'
    GROUP BY  patient_id
) as vid
INNER JOIN  visit b ON
      B.patient_id    =   vid.patient_id AND
      B.date_of_visit =   vid.first_date and
      month(B.date_of_visit)=3         AND 
      year(B.date_of_visit)=2018       AND
      B.visit_reason='Active'

INNER JOIN consultation ON 
    consultation.visit_id   =   B.visit_id

INNER JOIN diagnosis ON 
    diagnosis.diagnosis_id  =   consultation.diagnosis_id AND
    diagnosis.diagnosis_name LIKE '%Cardio%'
  • 0
    Это даст все записи по группе, а не первые записи в группе. Поскольку вы не использовали значение min (visit.date_of_visit) в соединении.
  • 0
    Нет, это не первая дата визита
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню