2012-10-09 25 views
1

對於我來說這個場景很難解釋,但我想要獲得準備進行解僱會議的用戶列表(實際上是「患者」)。根據記錄的條目查找用戶列表

局勢

我有一個病人表:

PATIENT 
id (int) 
name (varchar) 

患者遵循特殊的工藝,在那裏我有明確的階段:

PHASE 
id (int) 
name (varchar) 

我記錄所有的病人階段:

STATUS 
id   (int) 
phase_id (int) 
patient_id (int) 
timestamp (datetime) 

術語「準備開會」表示會議正在計劃中。這樣的計劃會議記錄在消息表中。計劃會議的消息具有「meeting_planned」類型,例如會議完成時,會有一個新消息「meeting_done」。

MESSAGE 
id   (int) 
patient_id (int) 
type  (enum) 
value  (varchar) 
timestamp (datetime) 

我的查詢

我要尋找一個查詢現在,我真的不能拿出。我的邏輯是:

  1. 選擇所有患者;
  2. 其中上次狀態(基於時間戳)來自階段名稱「C」或「D」;
  3. 哪裏有消息與類型 meeting_planned。

廣告2:患者可以在兩個階段之一。當患者處於A,B,E或F階段時,不能計劃會議。當患者處於C階段時,護士可能已經決定已經開始計劃會議,但是如果沒有發生,它將在階段D發生(D始終在C之後,它是A> B> C> D> E> F)。

廣告3:可能有其他消息,但從來沒有這種類型。在+ patient_id上有一個獨特的常量。如果會議已計劃併發生,則有兩條消息(類型1 = meeting_planned,類型2 = meeting_done)。如果沒有計劃會議,則不會發生meeting_planned類型,但可能已經設置了其他消息。

有什麼我試圖

我來到了現在這個查詢:

我的問題

在上面查詢我有兩件事情我不能管理:

  1. I h大夫在名單上翻了一番。任何階段D的患者也會出現C期患者(如此雙重)。我嘗試了SELECT DISTINCT但沒有制定出
  2. 我現在是基於他們的名字排除階段,但我想從狀態上的時間戳訂購階段,只能看最後的狀態從那裏

廣告1:現在看起來是這樣的:

ID NAME PHASE 
1 John C 
2 Jane C 
3 Tom C 
4 Pete C 
5 Anna C 
1 John D 
2 Jane D 
3 Tom D 

而且很明顯,我想這樣的:

ID NAME PHASE 
4 Pete C 
5 Anna C 
1 John D 
2 Jane D 
3 Tom D 

我現在我不能使用GROUP BY在這裏,因爲我然後必須使用COUNT或類似的分組功能。

有沒有任何SQL大師在這裏幫助我?

回答

0
SELECT p.id, p.name, max(ph.name) as phase 

FROM patient p 

    LEFT JOIN status s ON p.id=s.patient_id 
    LEFT JOIN phase ph ON ph.id=s.phase_id 
    LEFT JOIN message m ON p.id=m.patient_id 

WHERE (ph.name='C' OR ph.name='D') 
    AND (m.type != 'meeting_planned' OR m.type IS NULL) 
    AND p.id not in (
     select p.id 
     from 
      patient p 
      inner join 
      status s on p.id = s.patient_id 
      inner join 
      phase ph on ph.id = s.phase_id 
     where ph.name > 'D' 
     ) s 
group by p.id, p.name 
+0

謝謝,你幫我解決了我的問題的第一部分。那確實解決了!有了更多的測試數據,似乎我的AND(ph.name!='E')'不會取消已經處於階段「E」的用戶(因爲他們的狀態日誌仍然顯示它們已經處於「C」和「D」。我現在選擇的患者太多了,但我認爲我可以用子查詢來管理... –

+0

@JurianSluiman我編輯了答案。 –

+0

謝謝,我自己也想出了這個子查詢。 ,這是一個快速反應! –

相關問題