2012-12-20 45 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