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

时间:2018-04-11 10:44:53

标签: mysql sql mysql-workbench

我有以下查询,我将最终获得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并将其运行到其他查询中,以查看我们有多少种疾病,如心血管疾病,然后是呼吸系统疾病。

我的数据库结构如下:

enter image description here

我想要的是获取每位患者的身份证明,他们在首次就诊时诊断出来的情况(所以我们将在这里与min(visit.date_of_visit)合作)

`diagn_name LIKE'%Cardio%'

的理想结果

E.g>:

  

患者:150(或某事)

更改查询以获取呼吸信息。

我尝试使用以下选择的心脏病:

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年3月3日; visit_reason =活动; ...;   patient_id = 1234;

     

visit_id = 2; date_of_visit = 2018年3月4日; visit_reason =活动; ...;   patient_id = 1239;

     

visit_id = 3; date_of_visit = 2018年3月7日; 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;诊断名称:高血压(心脏病);

     

diagnosis_id = 13;诊断名称:肾脏疾病

通过运行查询来查看来到医院的患者以及他们在初次就诊时被诊断为患有心脏病的患者,结果应该在示例中为 2 ,如您所见patient_id = 1234有2次访问的例子,但我需要知道他在第一次访问时有什么。

2 个答案:

答案 0 :(得分: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%'

答案 1 :(得分: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%';

使用日期时,最好将列值直接与日期进行比较,而不是将其分解。