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 人员来说是一个明智的选择......

4

3 回答 3

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
于 2012-12-20T04:40:22.940 回答
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 

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

于 2012-12-20T04:37:44.030 回答
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
于 2014-11-08T13:28:01.840 回答