У меня есть следующий запрос, в котором у меня будет, наконец, 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 идентификаторов и запустить их в другой запрос, чтобы узнать, сколько заболеваний у нас есть как сердечно-сосудистые, а затем как респираторные заболевания.
Моя структура базы данных выглядит следующим образом:
Я хочу, чтобы получить для каждого пациента идентификатор, что они были диагностированы ТОЛЬКО их первый визит в больницу (так что здесь мы будем работать с 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 посещения, но Мне нужно знать, что у него было в его первом.
Вы можете использовать функции окна в 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%';
При работе с датами лучше сравнивать значения столбцов непосредственно с датами, а не анализировать их.
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%'