MYSQL - 将最近的匹配记录从一个表加入另一个表

时间:2010-10-06 04:05:15

标签: mysql sql greatest-n-per-group

我有两个看起来像这样的表:

表:案例

ID
命名
状态
case_no

表:备注

ID
CASE_ID
note_date
笔记

我希望能够创建一个查询来从案例表中获取数据,并且只能从案例表中的每一行中的notes表中获取最新的条目。到目前为止,我根本没有运气。

任何指针都会非常感激

3 个答案:

答案 0 :(得分:11)

这将只返回带附注的案例:

SELECT c.*,
       x.*
  FROM CASES c
  JOIN NOTES x ON x.case_id = c.case_id
  JOIN (SELECT n.case_id,
               MAX(n.note_date) AS max_note_date
          FROM NOTES n
      GROUP BY n.case_id) y ON y.case_id = x.case_id
                           AND y.max_note_date = x.note_date

如果您想要所有案件,无论他们是否附上说明:

   SELECT c.*,
          x.*
     FROM CASES c
LEFT JOIN NOTES x ON x.case_id = c.case_id
     JOIN (SELECT n.case_id,
                  MAX(n.note_date) AS max_note_date
             FROM NOTES n
         GROUP BY n.case_id) y ON y.case_id = x.case_id
                              AND y.max_note_date = x.note_date

答案 1 :(得分:5)

    SELECT *
      FROM cases c
INNER JOIN notes n ON n.case_id = c.id
                  AND n.id = (SELECT MAX(id)
                                FROM notes
                               WHERE case_id = c.id)

通常的做法是将指针直接保存在cases表中的最后一个音符ID并使用触发器支持

答案 2 :(得分:1)

我最近遇到了同样的问题,这个论坛对我帮助很大,但我发现OMG小马的答案并不完整。它适用于带有注释的情况,但不适用于没有注释的情况,这是我的问题。 我的回答是类似的,但是我将其与案例一起加入小组查询。

这将是:

SELECT c.*, x.*
FROM CASES c
    LEFT JOIN (SELECT n.case_id, MAX(n.note_date) AS max_note_date
               FROM NOTES n
               GROUP BY n.case_id) y ON y.case_id = c.case_id
    LEFT JOIN NOTES x ON x.case_id = c.case_id AND x.note_date=y.max_note_date

获取只删除一个左关键字或两者的注释的情况也是有效的