как ограничить SQL Left JOIN, чтобы вернуть только последнюю запись вторичной таблицы - PullRequest
0 голосов
/ 03 января 2019

У меня есть две таблицы ( документы и состояния ). документы поля:

id,      (int)
document,(string)
file,    (string)
creation (date) 

состояния поля:

id,          (int)
id_document, (int)
status,      (string)
last_update  (date)

id_document очевидно совпадают id в первой таблице.

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

Я написал этот запрос, но это делает правильное объединение, но яневозможно ограничить его последним статусом:

SELECT
 documents.*, states.status, states.last_update  
FROM
 documents
LEFT JOIN states ON states.id = documents.id
ORDER BY states.last_update

Я пытался с DISTINCT, DISTINCTROW, но без удачи ....

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Использовать подзапрос с max (last_status) для каждого документа.Затем присоедините внутренний подзапрос к вашему запросу в документе и last_status.

0 голосов
/ 03 января 2019

Это должно обеспечить то, что вы ищете (может существовать более элегантное решение):

  select d.*,
         s.status, 
         s.last_update
  from   documents d,
         states s
  where  s.id = d.id
  and    s.last_update = ( select last_update
                           from   states
                           where  id = d.id
                           order by last_update desc
                           limit 0,1 )
  or     s.last_update is NULL;
0 голосов
/ 03 января 2019

Может быть, это работает:

SELECT
 documents.*, updates .status, updates.updated 
FROM
 documents
LEFT JOIN (SELECT id_document, status, MAX(last_update) AS updated 
           FROM states 
           GROUP BY id_document) AS updates 
     ON states.id = documents.id
ORDER BY states.last_update
...