SQL STATEMENT-每个ID获得一个结果,但只有一个具有最新日期的结果

时间:2019-05-07 20:25:39

标签: mysql

我有一个将文档存储在数据库中的系统,每个用户可以创建多个文档,并且每个文档以不同的版本保存。每个用户都有一个唯一的令牌。每个文档都有一个唯一的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

实现此目的的查询看起来如何?

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

使用此查询:

select token, docid, max(time) time
from tablename
group by token, docid

对于每个timetoken,您都会获得最新的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  |