0

首先,我的 SQL 知识有点生疏。我正在尝试生成每个患者在一段时间内经历的评论报告。审查是作为医生轮次的一部分进行的。以下是具有相关列的相应表格:

Patients: (id, name)

Rounds: (id, patient_id, date)

Reviews: (id, round_id, review)

报告应如下所示:

Patient     |     Reviews
_________________________

Patient 1   |   2
_________________________ 
Patient 2   |   1
_________________________ 
Patient 3   |   0
_________________________

我尝试了以下 SQL 语句:

SELECT 
    p.name as patient, 
    COUNT(r.round_id) as reviews
FROM 
    patients as p
    JOIN rounds as ro ON p.id = ro.patient_id
    JOIN reviews as r ON ro.id = r.round_id
WHERE 
    r.review_date between '2012-02-01' AND '2012-02-29'
GROUP BY 
    p.name

但是,上面的查询只返回评论数大于 1 的行。即使计数为 0,我也希望它返回。

4

2 回答 2

2

加入表并在其中一个表中包含不匹配的实例的最简单方法是使用 LEFT OUTER JOIN。这将匹配左侧的所有记录,无论是否在 JOIN 的右侧找到匹配项。

由于您的 r.review_date 在您的 WHERE 子句中,因此除非在这些日期之间进行审核,否则不会发生匹配。因此,要包含没有审查的实例,您必须在 WHERE 子句中添加“OR r.review_date IS NULL”,如下所示。您可能还需要考虑对 round.date 字段进行过滤,以便您只查看在该时间范围内执行了有效回合的实例。IE。“'2012-02-01' 和 '2012-02-29' 之间的日期在哪里”

例如。

SELECT
    p.name as patient, 
COUNT(r.round_id) as reviews
FROM 
    patients as p
    JOIN rounds as ro ON p.id = ro.patient_id
    LEFT OUTER JOIN reviews as r ON ro.id = r.round_id
WHERE 
    r.review_date between '2012-02-01' AND '2012-02-29' OR r.review_date IS NULL
GROUP BY 
    p.name

注意:如果您想报告没有任何轮次的记录,您还必须将第一个 JOIN 也设为 LEFT OUTER JOIN。

FROM 
    patients as p
    LEFT OUTER JOIN rounds as ro ON p.id = ro.patient_id
    LEFT OUTER JOIN reviews as r ON ro.id = r.round_id
于 2012-06-19T15:38:03.990 回答
2
SELECT  p.name AS patient
      , COUNT(r.ID) AS reviews
FROM    patients AS p
        LEFT JOIN rounds AS ro ON p.id = ro.patient_id
        LEFT JOIN reviews AS r ON ro.id = r.round_id
                                  AND r.review_date BETWEEN '2012-02-01'
                                                    AND     '2012-02-29'
GROUP BY p.name

将为您提供所有患者的名单,包括在您的特定日期之间没有进行过检查或复查的患者。没有查房或复查的患者得分为 0。

于 2012-06-19T15:37:07.560 回答