mysql - sql MySql从查询获得第一个结果和最后一个结果

我在数据库中创建了一些文档记录,每个文档可以有多个版本。 每个新版本都是数据库中的新记录。 为了将文档版本组合在一起,我将为它们分配一个共享的惟一 id groupId

我试图从数据库中获取的是最新的文档版本,但我还希望在日期创建原始文档:


documents table


- id


- group_id


- version


- created_at



示例记录:


id: 1, group_id: 'xyz', version: 1, created_at: date


id: 2, group_id: 'xyz', version: 2, created_at: date


id: 3, group_id: 'xyz', version: 3, created_at: date


etc...



我想要使用不同的或者 ORDER BY,然后在查询上添加一个限制 1,只要获得 1个结果:


SELECT * FROM documents 


WHERE group_id='xyz'


ORDER BY 'created_at' DESC


LIMIT 1



但是如何包括原始文档的created_at日期,除了( 而不是) 最新版本的版本日期?

我知道我可以用 ORDER BY 'created_at' ASC LIMIT 1 但有没有办法在1个查询中完成所有操作?

时间:

你可以使用子查询:


SELECT * FROM documents 


WHERE id in (


 select min(id) FROM documents WHERE group_id='xyz'


 union


 select max(id) FROM documents WHERE group_id='xyz'


)



在查询的CREATED_AT中添加子查询可以执行以下操作:


select id, group_id, created_at, (select min(created_at) from documents d2 where 


d2.group_id = d.group_id)


from documents d


where group_id = 'xyz'


order by created_at desc


limit 1 



由于原始文档的CREATED_AT日期不会改变,我建议对该数据进行规范化,并添加新的列 ORIGINAL_CREATED_AT 。

SELECT MIN(created_at) AS date_created, MAX(created_at) AS date_updated, group_id FROM documents WHERE group_id = 'xyz' GROUP BY group_id

如果为单个组,我将执行以下操作:


select lastd.*,


 (select min(d2.created_at)


 from documents d2


 where d2.group_id = d.group_id


 ) as first_created_at


from (select d.*


 from documents d


 where group_id = 'xyz'


 order by created_at desc


 limit 1


 ) lastd;



特别是,这可以在 documents(group_id, created_at) 上使用索引。

这里查询:


select d.* 


from documents d inner join (


 select group_id, min(created_at) mindate, max(created_at) maxdate


 from documents


 group by group_id 


) g on d.group_id = g.group_id and (d.created_at in (g.mindate, g.maxdate))



为每个 group_id 提供包含最小和最大 created_at的所有行。
你可以添加任何需要的条件:


where d.group_id = 'xyz'



...