2013-07-05 101 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