我有一个将文档存储在数据库中的系统,每个用户可以创建多个文档,并且每个文档以不同的版本保存。每个用户都有一个唯一的令牌。每个文档都有一个唯一的ID。每个文档都存储了多次,但存储的时间不同。
我的表格示例
|AI |token |docid time|
|1 |id1 |doc1 1000|
|2 |id2 |doc2 1001|
|3 |id1 |doc1 909 |
|4 |id2 |doc1 1020|
|5 |id1 |doc3 801 |
我需要的是一个查询,该查询仅向我提供特定用户的每个文档的最新信息。
因此,在此示例中,我希望令牌ID为1的用户使用
:1 id1 doc1 1000
5 id1 doc3 801
实现此目的的查询看起来如何?
非常感谢您的帮助
答案 0 :(得分:1)
使用此查询:
select token, docid, max(time) time
from tablename
group by token, docid
对于每个time
和token
,您都会获得最新的docid
。
如果不需要AI
列,就可以了。
如果还需要AI
列,则必须将此查询加入到表中:
select t.*
from tablename t inner join (
select token, docid, max(time) time
from tablename
group by token, docid
) g on g.token = t.token and g.docid = t.docid and g.time = t.time
如果只需要令牌='id1'的结果,则可以添加条件:
where t.token = 'id1'
或者您也可以使用NOT EXISTS
:
select t.*
from tablename t
where
t.token = 'id1'
and not exists (
select 1 from tablename
where token = t.token and docid = t.docid and time > t.time
);
请参见demo。
结果:
| ai | token | docid | time |
| --- | ----- | ----- | ---- |
| 1 | id1 | doc1 | 1000 |
| 5 | id1 | doc3 | 801 |