【问题标题】:Using select from another select in MySQL在 MySQL 中使用 select from another select
【发布时间】:2018-09-21 05:14:41
【问题描述】:

我有以下查询,我最终将使用 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; date_of_visit=2018-03-04; visit_reason=活动; ...; 患者id=1239;

visit_id= 3; date_of_visit=2018-03-07; visit_reason=活动; ...; 患者id=1234;

咨询表

consultation_id=1; ...;诊断ID=12;访问id=1;...;

consultation_id=2; ...;诊断ID=12; visit_id=2;...;

诊断表

diagnosis_id=12;诊断名称:高血压(心脏病);

diagnosis_id=13;诊断名称:肾病

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

【问题讨论】:

  • 您想在您的问题中添加示例数据(作为文本)吗?
  • 是的。请给我几分钟。
  • 以及基于示例数据的预期输出(作为文本)。
  • 完成。您可以查看示例。
  • 格式错误的示例数据将花费我们很多时间来处理.. 你能把它变成一个基于 ascii 的数据吗 -> ozh.github.io/ascii-tables 你让它基于 ascii 我们可以简单地使用 sqlfiddle.com ascii 导入器生成创建和插入语句...或使用 mysql-workbench 导出功能从您的数据生成 CSV -> dev.mysql.com/doc/workbench/en/…

标签: mysql sql mysql-workbench


【解决方案1】:

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

【讨论】:

  • 这将给出每组的所有记录,而不是每组的第一条记录。因为您没有在连接中使用 min(visit.date_of_visit) 值。
  • 不,不是第一次访问
  • 这段代码存在一些问题 - min(visit.date_of_visit) 需要别名,vid.first_date 应该是 vid.alias 否则根据我对问题的理解它是正确的并产生计数2
  • 是的,min(visit.date_of_visit) 别名 -> first_date 在连接中用作 vid.first_date。您可以根据需要自定义它。如果有其他疑问,请再次与我联系。如果您愿意,请验证我的答案。谢谢。
【解决方案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%';

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

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2014-06-17
    • 2013-10-11
    • 1970-01-01
    相关资源
    最近更新 更多