查找流程中某个阶段的所有用户

时间:2012-11-06 12:29:59

标签: mysql sql

我有Patient,它遵循使用多个Phase定义的流程。当患者处于某个阶段时,会在特定时间戳上创建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,我会看到status.timestampmax_timestamp不同。

在这个查询中,我甚至没有在阶段表中使用order,我只是想先在id上订购,但由于流程可能会随着时间的推移而改变,我认为这将是一个坏主意。所以这也不见了。

问题

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

2 个答案:

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

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