Подтвердить что ты не робот

Показывать только последнюю дату из объединенной таблицы MySQL.

У меня есть 2 таблицы, таблица "document" и таблица "content". Они выглядят так (упрощенно):

document table:
docID
docTitle

content table:
contentID
docID
dateAdded
content

Для каждого изменения контента новая запись вставляется в таблицу "контент". Таким образом, есть полная история всех изменений. Я хотел бы получить список всех документов, с которым связался последний контент. Он должен вернуть docID, docTitle и связанную запись контента с самым новым значением "dateAdded". Мой мозг терпит неудачу сейчас, как мне создать это соединение?

4b9b3361

Ответ 1

Это можно сделать с помощью подзапроса:

SELECT d.docID, docTitle, c.dateAdded, c.content
FROM document d LEFT JOIN content c ON c.docID = d.docID
WHERE dateAdded IS NULL
    OR dateAdded = (
        SELECT MAX(dateAdded)
        FROM content c2
        WHERE c2.docID = d.docID
    )

Это называется "групповой максимум"

Изменить: сделанный запрос возвращает все строки документа с NULL, если нет связанного содержимого.

Ответ 2

Использование:

SELECT t.docid, 
       t.docTitle, 
       mc.dateAdded, 
       mc.content
  FROM DOCUMENT t
  JOIN (SELECT c.docid,
               c.content,
               MAX(c.dateAdded)
          FROM CONTENT c
      GROUP BY c.docid, c.content) mc ON mc.docid = t.docid 
                                     AND mc.dateadded = t.dateadded

Это должно быть быстрее, чем коррелированный подзапрос.

Альтернатива, если нет записей контента для документа:

   SELECT t.docid, 
          t.docTitle, 
          mc.dateAdded, 
          mc.content
     FROM DOCUMENT t
LEFT JOIN (SELECT c.docid,
                  c.content,
                  MAX(c.dateAdded)
             FROM CONTENT c
         GROUP BY c.docid, c.content) mc ON mc.docid = t.docid 
                                     AND mc.dateadded = t.dateadded

Ответ 3

Не могли бы вы просто сделать простое соединение и упорядочить по дате, а захватить только первую запись?

SELECT docTable.docId, docTable.docTitle from docTable
INNER JOIN content ON content.docID = docTable.contentID
WHERE docTable.docId = <some id>
ORDER BY content.dateAdded DESC

Ответ 4

Это решение с двумя запросами:

Первый запрос:

select docID, max(dateadded) from [TblContent] group by docID

Второй запрос:

select [TblDocument].* from [TblDocument]  
inner join [TblDocument] on [TblDocument].[Docid]=[FirstQuery].[DocID]

Ответ 5

попробуйте следующее:

select d.id, d.docTitle, MAX(c.dateAdd)
from document_table d
left join content_table c
on d.id = c.docId
group by d.id

Вот за этим стоит задуматься: предположим, что в таблице документа есть запись A, связанная с контентом (1, 2, 3, 4) и B, связанная с (5, 6, 7, 8)

document        content

A               1
            2
                    3
            4

B               5
            6
            7
            8

внутреннее соединение с max (dateadded) даст вам

document        content     max(dateadded)

A               1           1-1-2009...

A               2           1-1-2009...

A               3           1-1-2009...

A               4           1-1-2009...

B               5           2-1-2009...

B               6           2-1-2009...

B               7           2-1-2009...

B               8           2-1-2009...

после группы по идентификатору документа вы получите

document    content     max(dateadded)

A           1           1-1-2009...

B           5           2-1-2009...

note: идентификатор содержимого не обязательно соответствует идентификатору max dateedded