在MYSQL中的多个表中选择MAX

时间:2013-07-05 10:11:39

标签: mysql greatest-n-per-group

我试图列出患者及其最近的主要保险福利。我有三张桌子,

  

患者(包含患者人口统计数据)
  福利(包含保险福利信息)
  rel_pat_ben(将患者表的主键与福利表上的相应键匹配)

我差点解决了这个问题:

  

SELECT p.patient_id,MAX(b.benefits_id),b.effective_date
  来自患者AS p
  LEFT JOIN rel_pat_ben AS rpb USING(patient_id)
  LEFT JOIN受益AS b ON(rpb.benefits_id = b.benfits_id AND b.order ='primary')
  GROUP BY patient_id

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

是否有办法只返回每位仅包含最新保险福利的患者的一条记录?

2 个答案:

答案 0 :(得分:0)

如果您尝试添加

,该怎么办?
ORDER BY b.effective_date DESC

在GROUP BY子句之后?

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

我正在使用INNER JOINS,所以如果患者没有任何好处,就不会退回。

相关问题