2010-07-18 113 views
1

我有一個非常簡單的SQL初學者問題。我在我的數據庫中定義了3個表格:「醫生」,「患者」,「訪問」。爲了簡單起見,我只有這些表的一對多關係:一名醫生有很多患者,但是一名患者只能看到一名醫生,一名患者可以進行多次訪問...在我的「訪問」表中我有一個字段「時間戳」知道什麼時候是最後一次訪問。關於mySQL的非常簡單的查詢(初學者問題)

我想在MySQL上做一個「視圖」,我將爲每位醫生提供來訪的最新患者,以及最近的一位。假設每位醫生每天看到10位患者,我只想爲每位醫生提供一次訪問他的最後一位醫生。

我該怎麼做這樣的觀點?

感謝您的幫助

編輯答案1

=>謝謝!

我終於選擇了一個更現實的方法,即「患者」可以因此看到許多「醫生」 ,我的表「訪問」將是這樣的:

 
idVisit idDoctor idPatient timestamp 
1  1   1   2010-07-19 14:10 
2  1   2   2010-07-19 15:10 
3  2   1   2010-07-19 15:10 
4  3   1   2010-07-19 16:10 
5  2   2   2010-07-19 18:10 
6  2   3   2010-07-19 19:10 
7  1   1   2010-07-19 20:10 

我有那麼3例和3醫生。例如,患者1去了兩次看醫生1,一次看醫生2和一次看醫生3.

我想建立我的請求,以便對每個(醫生,患者)我有最後一次訪問。這個查詢應該返回ID訪問(2,3,4,5,6)而不是1,因爲病人付給醫生1的最後一次訪問是在20:10而不是14:10。我怎麼能這樣做?

再一次,我真的很感謝你的意見和你的幫助。在我開始使用SQL時,它確實幫助我改進設計。

+0

我想我們可以假設你的架構容貌如下所示: VISITS具有(至少)列doctorID,patientID和時間戳。 – SwissCoder 2010-07-18 20:52:14

+1

請注意,您應該堅持數據庫表的命名約定。 使用單數(或複數,如果你真的想要,但那不太推薦)。但不能混合使用。你有醫生的桌子,所以最好留在病人和訪問表 – SwissCoder 2010-07-18 20:54:03

+0

謝謝,我的設計將考慮到這一點。並且您對訪問表列 – am38 2010-07-18 21:31:09

回答

0

這是一個SQL問題,如果你給你的表模式,我們可以給你實際的正確的SQL

我會從醫生內做

選擇醫生,MAX(參觀) 加入患者XXX內部聯接上YYY

vistits這給你的醫生和最後VIST的一個IST - 加入這個來訪問得到病人,完成任務

3

我們使用訪問表查找每個病人的最新訪問,b y按患者ID分組並選擇MAX(visitTime)。然後,我們通過患者表將患者與他/她的醫生聯繫起來。

SELECT doctorID, patientID, lastVisit FROM 
    Patients INNER JOIN (
     SELECT patientID, MAX(visitTime) AS lastVisit FROM Visits 
     GROUP by patientID) latestVisits 
    ON lastVisits.patentID = Patients.patentID 

編輯:我重新讀了這個問題,這不會給你什麼你想要的。由於它會列出重複的醫生ID,顯示所有患者的最近訪問。

要得到每名醫生的最新訪問,

SELECT doctorID, latestVisit, (SELECT p.doctorID, MAX(v.lastVisit) latestVisit 
    FROM Visits v INNER JOIN Patients p ON 
     v.patientID = p.patientID 
    GROUP BY p.doctorID) base INNER JOIN 
     (SELECT doctorID, patientID, lastVisit FROM 
     Visits v INNER JOIN Patients p ON 
      v.patientID = p.patientID) patientVisits ON 
     patientVisits.doctorID = base.doctorID AND patientVisits.lastVisit=base.lastVisit 

鑑於兩名病人不能看同一個醫生在同一時間,沒有返回每個醫生多行的風險。

+1

我只是稍微修改一下這個查詢到內部select中的'GROUP BY doctorID',這是我相信OP正在尋找的東西。 – quantumSoup 2010-07-18 20:55:37

+0

非常感謝!我會嘗試你的解決方案! – am38 2010-07-18 21:29:07

0

這裏的@搖頭丸的查詢的修改版本,其做什麼,我想你想:

SELECT doctorID, Patients.patientID, lastVisit FROM 
    Patients INNER JOIN (
     SELECT patientID, MAX(time) AS lastVisit FROM Visits 
     GROUP by doctorID) latestVisits 
    ON latestVisits.patientID = Patients.patientID 

這裏就是我假設你的模式是這樣的:

Doctors: doctorID 
Patients: patientID, doctorID 
Visits: doctorID, patientID, time