1

我有一个Patient遵循多个Phases 定义的过程。当患者处于某个阶段时,会Status在特定时间戳创建一个连接患者和阶段。

在 MySQL 中,我的表如下所示:

patient:
  id (int)

phase:
  id     (int)
  order: (int)
  name:  (varchar)

status:
  patient_id: (int, FK)
  phase_id:   (int, FK)
  timestamp:  (datetime)

现在我有 A > B > C > D 期。我想选择现在处于 B 期或 C 期的所有患者。必须排除仅处于 A 期的患者,处于 D 期的患者(因此具有 B 和 C 的状态)也必须排除。

我的试炼

所以我想要一个这样的选择开始:

SELECT p.*, s.*, ph.*
FROM patient p
LEFT JOIN status s on p.id  = s.patient_id
LEFT JOIN phase ph on ph.id = s.phase_id
WHERE s.id IN 
(
  // sub query
)
ORDER BY s.timestamp

我想选择具有给定状态 x 的所有患者。状态 x 是这样开始的:

SELECT status.*, phase.name
FROM status
LEFT JOIN phase ON phase.id=status.phase_id
WHERE phase.name IN ('B', 'C')
GROUP BY status.patient_id

但我无法解决剩下的问题:显然,在这个过程中没有为人们做出任何排斥。如果我max(status.timestamp) as max_timestamp在选择中添加 a,我会看到status.timestampmax_timestamp不同。

在这个查询order中,我什至没有使用相位表中id的 所以这也不见了。

问题

也许我完全走错了路,我根本不需要子查询。我认为问题很清楚:如何根据给定阶段的列表选择患者?

4

2 回答 2

1

编辑:添加到状态表的连接以显示最后状态更改的时间戳。

下面的查询给出了所有患者的当前状态。该phase.phase_order字段必须是唯一的,但这似乎是正确的。我认为您在问题中所说的实际上也phase.id给出了阶段顺序,在这种情况下,phase.order不需要并且可以替换为phase.id.

select
    p.id as patient_id,
    p.name as patient_name,
    ph.name as phase_name,
    s.timestamp as timestamp
from (
    select p.id as patient_id, max(ph.phase_order) as phase_order
    from patient p
    join status s on s.patient_id = p.id
    join phase ph on ph.id = s.phase_id
    group by p.id, p.name
) current
join patient p on p.id = current.patient_id
join phase ph on ph.phase_order = current.phase_order
join status s on s.patient_id = p.id and s.phase_id = ph.id
;

要仅显示给定阶段的患者,请添加where ph.name = 'phasename'到上述查询。

于 2012-11-06T13:23:18.813 回答
0

使用此查询:

SELECT p.*, s.*, ph.*
    FROM patient p
    LEFT JOIN status s on p.id  = s.patient_id
    LEFT JOIN phase ph on ph.id = s.phase_id
    WHERE p.id IN 
    (
       -- Those phase IDs you want.
    )
    ORDER BY s.timestamp
于 2012-11-06T12:32:33.633 回答