MYSQL - объединение самой последней совпадающей записи из одной таблицы в другую - PullRequest
2 голосов
/ 06 октября 2010

У меня есть две таблицы, которые выглядят так:

Таблица: чехлы

ID
Имя
статус
case_no

Таблица: примечания

ID
case_id
note_date
примечания

Я хотел бы иметь возможность создавать запрос, который извлекает данные из таблицы дел и только самую последнюю запись из таблицы заметок для каждой строки в таблице дел. Пока мне совсем не везет.

Любые указатели будут с благодарностью

Ответы [ 3 ]

11 голосов
/ 06 октября 2010

При этом будут возвращены только дела с прикрепленными примечаниями:

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
5 голосов
/ 06 октября 2010
    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 и поддержка его с помощью триггера

1 голос
/ 20 марта 2013

У меня недавно была такая же проблема, и этот форум мне очень помог, но я обнаружил, что ответ OMG Ponies не завершен. Это работает для случаев с заметками, но не для случаев без заметок, что является моей проблемой. Мой ответ похож, но вместо того, чтобы присоединиться к групповому запросу с примечаниями, я присоединяю его к кейсам.

Было бы:

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

Также допустимо получать только случаи с примечаниями, удаляющими одно левое ключевое слово или оба

...