1

Patient複数ので定義されたプロセスに従うaがあります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選択にaを追加すると、status.timestampとが表示されmax_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 に答える