2013-07-05 61 views
2

我想列出患者及其最近的主要保险福利。我有涉及三个表,在MYSQL的多个表中选择MAX

患者(包括病人的人口统计数据)
福利(包括保险金信息)
rel_pat_ben(匹配与相应的按键病人表的主键上的收益表)

我几乎解决了这个问题:

SELECT p.patient_id,MAX(b.benefits_id),b.effective_date
FROM患者为P
LEFT JOIN rel_pat_ben AS RPB USING(patient_id)
LEFT JOIN好处为b ON(rpb.benefits_id = b.benfits_id AND b.order = '初级')
GROUP BY patient_id

使用MAX似乎工作,因为id字段是自动递增的,但是当我发现使用较新信息编辑具有较低id的记录时,我意识到了我的问题。所以真的,我需要检查'effective_date'字段。

是否有一种方法可以只为每位患者返回一条只包含最近保险利益的记录?

+0

我添加了“最大每个组的标签。这类SQL问题已经被很多次的回答了。 –

+0

谢谢Bill!我保证在询问之前我努力寻找答案。我发现了很多类似的问题,但都没有解决我确切的问题。希望这会帮助下一个人。 – Charlie

回答

0

这将选择最大EFFECTIVE_DATE,如果存在的话,为每一位患者:

SELECT p.patient_id, MAX(b.effective_date) 
FROM 
    patients AS p INNER JOIN rel_pat_ben AS rpb USING(patient_id) 
    INNER JOIN benefits AS b ON (rpb.benefits_id=b.benfits_id AND b.order='primary') 
GROUP BY 
    p.patient_id 

,这将选择每一个病人最后的好处:

SELECT p.patient_id, b.* 
FROM 
    patients AS p INNER JOIN rel_pat_ben AS rpb USING(patient_id) 
    INNER JOIN benefits AS b ON (rpb.benefits_id=b.benfits_id AND b.order='primary') 
WHERE 
    (p.patient_id, b.effective_date) IN (
    SELECT p.patient_id, MAX(b.effective_date) 
    FROM 
     patients AS p INNER JOIN rel_pat_ben AS rpb USING(patient_id) 
     INNER JOIN benefits AS b ON (rpb.benefits_id=b.benfits_id AND b.order='primary') 
    GROUP BY 
     p.patient_id 
) 

我使用的是内部联接,从而如果病人没有任何好处,它将不会被退回。

+0

谢谢!你的第二个解决方案效果很好。第一个例子也可以像你所描述的那样工作,但不会给我对应的“benefits_id”(我需要)。如果我将它添加到SELECT部分​​,它将返回具有最高'effective_date'的第一个'benefits_id',即使该日期不属于'benefits_id'。再次,谢谢你! – Charlie

0

如果你尝试GROUP BY子句后加入

ORDER BY b.effective_date DESC 

+0

谢谢你的建议。我确实尝试过,有DESC和ASC两个参数,但它仍然只是给我第一个记录,而不是最新的。 – Charlie