Показывать только последнюю дату из объединенной таблицы MySQL.
У меня есть 2 таблицы, таблица "document" и таблица "content". Они выглядят так (упрощенно):
document table:
docID
docTitle
content table:
contentID
docID
dateAdded
content
Для каждого изменения контента новая запись вставляется в таблицу "контент". Таким образом, есть полная история всех изменений. Я хотел бы получить список всех документов, с которым связался последний контент. Он должен вернуть docID, docTitle и связанную запись контента с самым новым значением "dateAdded". Мой мозг терпит неудачу сейчас, как мне создать это соединение?
Ответы
Ответ 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