我有以下查询,最终将有 205 个患者 ID 可供使用:
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 个 ID,并将它们运行到其他查询中,以查看我们有多少种疾病,例如心血管疾病,然后是呼吸系统疾病。
我的数据库结构如下:
我想要的是获取每个患者的 ID,以及他们第一次去医院时诊断出的内容(所以在这里我们将与
min(visit.date_of_visit)
合作)
`diagnosis_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=活动; ...; 病人ID = 1234;
visit_id=2;访问日期=2018-03-04; Visit_reason=活动; ...; 病人ID = 1239;
visit_id=3;访问日期=2018-03-07; Visit_reason=活动; ...; 病人ID = 1234;
咨询台
consultation_id=1; ...;诊断id=12; Visit_id=1;...;
consultation_id=2; ...;诊断id=12; Visit_id=2;...;
诊断表
diagnosis_id=12;诊断名称:高血压(心脏病);
diagnosis_id=13;诊断名称:肾脏疾病
通过运行查询来查看来医院的患者,以及他们在初次就诊时被诊断为患有心脏病的患者,结果应在示例中为 2,如患者_id=1234 的示例所示两次访问,但我需要知道他第一次访问时有什么。
您可以在 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%';
使用日期时,最好将列值直接与日期进行比较,而不是剖析它们。
效果很好,现在就在现场场景中进行测试。
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%'