新手到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 :(得分: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