从多个表中选择最近的记录

时间:2012-12-20 04:04:31

标签: sql

新手到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人来说,这不是一件容易的事情......

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 

基本上,您使用子查询来查找患者最近的访问,然后将其连接回原始表以拉回与该值匹配的行。这仅适用于该日期有一行的情况。

答案 2 :(得分:0)

我在PostgreSQL上使用了如下脚本,它运行良好!

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