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

У меня есть следующий запрос, по которому у меня, наконец, будет 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 идентификаторов и запустить их в другой запрос, чтобы узнать, сколько заболеваний у нас: сердечно-сосудистые, а затем респираторные.

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

enter image description here

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

Желаемый результат для "имя_диагностики" LIKE "% Cardio%":

Например>:

Patients: 150 (Or something)

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

Я пробовал следующее для кардиологических заболеваний, где я использую 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=Active; ...; patient_id=1234;

visit_id= 2; date_of_visit=2018-03-04; visit_reason=Active; ...; patient_id=1239;

visit_id= 3; date_of_visit=2018-03-07; visit_reason=Active; ...; patient_id=1234;

Консультационный стол

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

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

Таблица диагностики

diagnosis_id=12; diagnosis_name: hypertension (cardio disease);

diagnosis_id=13; diagnosis_name: renal disease

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

Хотите добавить к своему вопросу образцы данных (в виде текста)?

P.Salmon 11.04.2018 12:47

Да. Дай мне несколько минут.

alim1990 11.04.2018 12:48

И ожидаемый результат (в виде текста) на основе данных примера.

Raymond Nijland 11.04.2018 12:49

Сделанный. Вы можете увидеть пример.

alim1990 11.04.2018 12:56

Плохо отформатированные примеры данных потребуют у нас много времени на работу .. Можете ли вы сделать их данными на основе ascii -> ozh.github.io/ascii-tables если вы сделаете их на основе ascii, мы можем просто использовать импортер sqlfiddle.com ascii для генерации операторов create и insert .. . Или используйте функцию экспорта mysql-workbench для создания CSV из ваших данных -> dev.mysql.com/doc/workbench/en/…

Raymond Nijland 11.04.2018 13:00

Я не совсем понимаю ваши данные - 1234 и 1239 были диагностированы с гипертонией во время их первого посещения, поэтому я ожидаю, что результат будет 2, это правильно?

P.Salmon 11.04.2018 13:32

Да, точно. Ты прав.

alim1990 12.04.2018 14:54
0
7
1 004
2

Ответы 2

БРО, работает нормально. Протестируйте это сейчас на живом сценарии.

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%'

Это даст всем записям в группе, а не первой записи в группе .. Поскольку вы не использовали значение min (visit.date_of_visit) в объединении.

Raymond Nijland 11.04.2018 13:11

Нет, это не первая дата посещения

alim1990 11.04.2018 13:18

С этим кодом есть некоторые проблемы - min (visit.date_of_visit) должен быть псевдоним, а vid.first_date должен быть vid.alias, иначе он верен в соответствии с моим пониманием вопроса и дает счет 2

P.Salmon 11.04.2018 13:34

Да, псевдоним min (visit.date_of_visit) -> first_date, который используется как vid.first_date в соединении. вы можете настроить его по своему усмотрению. если у вас есть еще один вопрос, снова свяжитесь со мной. Пожалуйста, подтвердите мой ответ, если хотите. Спасибо.

M Danish 11.04.2018 13:50

Вы можете использовать оконные функции в 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%';

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

Другие вопросы по теме