我有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.timestamp
和max_timestamp
不同。
在这个查询中,我甚至没有在阶段表中使用order
,我只是想先在id
上订购,但由于流程可能会随着时间的推移而改变,我认为这将是一个坏主意。所以这也不见了。
问题
也许我完全走错了路,我根本不需要子查询。我认为问题非常明确:我如何根据给定阶段列表选择患者?
答案 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