在MySQL中使用另一个select中的select

问题描述 投票:0回答:2

我有以下查询,最终将有 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 sql mysql-workbench
2个回答
1
投票

您可以在 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%';

使用日期时,最好将列值直接与日期进行比较,而不是剖析它们。


-1
投票

效果很好,现在就在现场场景中进行测试。

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%'
© www.soinside.com 2019 - 2024. All rights reserved.