简体   繁体   English

仅显示已加入MySQL表的最新日期

[英]Show only most recent date from joined MySQL table

I have 2 tables, a "document" table and a "content" table. 我有2个表,一个“文档”表和一个“内容”表。 They look like this (simplified): 它们看起来像这样(简化):

document table:
docID
docTitle

content table:
contentID
docID
dateAdded
content

For every content change, a new record is inserted into the "content" table. 对于每个内容更改,都会在“内容”表中插入新记录。 This way there is a complete history of all changes. 这样,所有变化都有完整的历史记录。 I would like to get a list of all the documents, with the latest content joined. 我希望获得所有文档的列表,并加入最新内容。 It should return the docID, docTitle, and the associated content record with the newest "dateAdded" value. 它应该返回docID,docTitle和相关内容记录以及最新的“dateAdded”值。 My brain is failing me right now, how would I create this join? 我的大脑现在正在让我失望,我将如何创建这个联接?

This can be done with a subquery: 这可以通过子查询来完成:

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
    )

This is known as a "groupwise maximum" query 这称为“分组最大”查询

Edit: Made the query return all document rows, with NULLs if there is no related content. 编辑:使查询返回所有文档行,如果没有相关内容则返回NULL。

Use: 使用:

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

This should be faster than a correlated subquery. 这应该比相关子查询更快。

Alternative for when there are no content records for a document: 当没有文档的内容记录时的替代方法:

   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

Could you not just do a simple join, and order by date added, and grab only the first record? 你能不能只做一个简单的连接,并按日期添加订单,只抓住第一条记录?

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

This is a 2 query solution: 这是一个2查询解决方案:

First query: 第一个查询:

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

Second query: 第二个查询:

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

try this: 试试这个:

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

Here is the thinking behind it: suppose document table has record A related to content(1, 2, 3, 4) and B related to (5, 6, 7, 8) 以下是它背后的思考:假设文档表有与内容(1,2,3,4)相关的记录A和与(5,6,7,8)相关的B

document        content

A               1
            2
                    3
            4

B               5
            6
            7
            8

a inner join with max(dateadded) will give you 一个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...

after group by document id you will get 按照文档ID分组后,您将获得

document    content     max(dateadded)

A           1           1-1-2009...

B           5           2-1-2009...

note: content id does not necessary match the id of the max dateadded 注意:内容ID不必与max dateadded的id匹配

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM