MYSQL - Join most recent matching record from one table to another

前端 未结 3 1785
难免孤独
难免孤独 2020-12-10 09:44

I have two tables that look like this:

Table: cases

id
name
status
case_no

Table: notes

id
case_id
note_date
notes

相关标签:
3条回答
  • 2020-12-10 10:11

    I have been having same problem recently and this forum has helped me a lot but I found the OMG Ponies answer isn't complete. It works for those cases with notes but it doesn't for cases without notes which is my issue. My answer is similar but instead joining the group query with notes, I join it with cases.

    It would be:

    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
    

    It's also valid to get just cases with notes removing one left keyword or both

    0 讨论(0)
  • 2020-12-10 10:12

    This will return only the cases with notes attached:

    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
    

    If you want all cases, regardless if they have a note attached:

       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
    
    0 讨论(0)
  • 2020-12-10 10:14
        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)
    

    Also it is a common practice to keep the pointer to the last note id directly in cases table and support it with trigger

    0 讨论(0)
提交回复
热议问题