在MYSQL中的多个表中选择MAX

在MYSQL中的多个表中选择MAX,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,我试图列出患者及其最近的基本保险福利。我有三张桌子 患者(包含患者人口统计数据) 福利(包含保险福利信息) rel_pat_ben(将患者表的主键与福利表上的相应键匹配) 我几乎解决了这个问题: 选择p.患者id、最大值(b.福利id)、b.生效日期 来自患者,如p 使用(患者id)将rel_pat_ben作为rpb左连接 以b ON(rpb.benefits\u id=b.benfits\u id和b.order='primary')的形式左键连接福利 按患者id分组 当id字段是自动递增的时

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

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

我几乎解决了这个问题:

选择p.患者id、最大值(b.福利id)、b.生效日期
来自患者,如p
使用(患者id)将rel_pat_ben作为rpb左连接
以b ON(rpb.benefits\u id=b.benfits\u id和b.order='primary')的形式左键连接福利
按患者id分组

当id字段是自动递增的时,使用MAX似乎起作用,但当我发现一个id较低的记录被更新的信息编辑时,我意识到了我的问题。所以,我真的需要检查“生效日期”字段

有没有一种方法可以让每个患者只返回一个记录,其中只包含最近的保险福利?

如果您尝试添加

ORDER BY b.effective_date DESC

在分组依据条款之后?

这将为每位患者选择最大有效日期(如果存在):

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
  )
这将为每位患者选择最后一项福利:

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
  )

我正在使用内部连接,因此如果对患者没有好处,它将不会被退回。

我添加了
best-n-per-group
标签。这类SQL问题已经被回答了很多次。谢谢比尔!我保证在问之前我会认真地寻找答案。我发现了许多相似的问题,但没有一个能解决我的问题。希望这能帮助下一个人。谢谢你的建议。我试过了,有DESC和ASC两个参数,但它还是给了我第一条记录,不是最新的。谢谢!您的第二个解决方案运行良好。第一个示例也与您描述的一样有效,但没有给我相应的
benefits\u id
(我需要)。如果我将其添加到选择部分,它将返回具有最高生效日期的第一个
福利id
,即使该日期不属于该
福利id
。再次感谢你!