2012-12-20 91 views
2

SQL的新手,剛走出我的舒適區。我在WPF應用程序中使用MySQL。從多個表格中選擇最近的記錄

我在我的數據庫中有三個表。

患者:

ID | Name | ... 

介紹人:

ID | FK_Patient_ID | ... 

訪問:

ID | FK_Referral_ID | Date | FollowUpDate | FollowUpInterval | ... 

的 'FK' 字段外鍵進入其他表。所以訪問屬於轉診,轉診屬於患者。

我希望得到最近訪問爲每一個病人(或轉診,因爲你不能沒有轉診訪問),並得到如下:

patients.ID | patients.Name | visits.FollowUpDate | visits.FollowUpInterval 

我試圖要做的是得到一個錯過了後續訪問的病人名單。

希望這是給你的SQL的人在那裏沒有道理的......

+0

訪問表中的ID是否爲自動增量和唯一?我要做的是按照降序排列訪問次數,以獲取最新記錄 –

+0

或使用WHERE referral.ID =(SELECT MAX(ID)FROM referral),如果需要單個記錄 – cha

+0

訪問表中的ID是自動增量和獨特 – akevan

回答

2
SELECT p1.ID 
     ,p1.Name 
     ,v1.FollowUpDate 
     ,v1.FollowUpInterval 
FROM Patients p1 
     INNER JOIN 
     Referals r1 ON p1.ID=r1.FK_Patient_ID 
     INNER JOIN 
     Visits v1 ON r1.ID=v1.FK_Referral_ID 
     INNER JOIN (
     SELECT MAX(v.ID) AS ID 
     FROM Patients p 
       INNER JOIN 
       Referals r ON p.ID=r.FK_Patient_ID 
       INNER JOIN 
       Visits v ON r.ID=v.FK_Referral_ID 
     GROUP BY p.ID) v2 ON v1.ID=v2.ID 
+0

有幾個修正(只是拼寫錯誤),這完美的作品,謝謝! – akevan

1

我不是100%肯定,如果這個工程與MySQL,但這裏的,你能做到這一點在SQL Server中的一種方式,而我認爲這是便攜式:

SELECT p.ID, p.NAME, v.FollowUpDate, v.FollowUpInterval 
FROM Patients p 
    JOIN Referrals r ON p.ID = r.FK_PatientID 
    JOIN Visits v ON ON r.ID = v.FK_Referral_ID 
    JOIN (SELECT r.FK_Patient_ID, MAX(v.Date) AS [Date] 
      FROM Referrals r 
       JOIN Visits v ON r.ID = v.FK_Referral_ID 
      GROUP BY r.FK_Patient_ID 
     ) x ON p.ID = x.FK_Patient_ID 
       AND v.Date = x.Date 

基本上,您使用子查詢來找到病人最近的訪問,然後再加入回你原來的表給拉了回來匹配值的行。這隻適用於該日期有一行的情況。

0

我在PostgeSQL上使用瞭如下腳本,它工作正常!

SELECT p.ID, p.NAME, v.FollowUpDate, v.FollowUpInterval 
FROM Patients p 
    INNER JOIN Referrals r ON p.ID = r.FK_PatientID 
    INNER JOIN Visits v ON ON r.ID = v.FK_Referral_ID 
    INNER JOIN (SELECT r.FK_Patient_ID, MAX(v.Date) AS "Date" 
       FROM Referrals r 
       INNER JOIN Visits v ON r.ID = v.FK_Referral_ID 
       GROUP BY 
       r.FK_Patient_ID 
       ) x ON p.ID = x.FK_Patient_ID AND v.Date = x.Date