MySQL的 - 一个ID下选择行,由列值组具有最新时间戳
表:MySQL的 - 一个ID下选择行,由列值组具有最新时间戳
----------------------------------------------------
ID | field_name | field_value | timestamp
----------------------------------------------------
2 | postcode | LS1 | 2016-11-09 16:45:15
2 | age | 34 | 2016-11-09 16:45:22
2 | job | Scientist | 2016-11-09 16:45:27
2 | age | 38 | 2016-11-09 16:46:40
7 | postcode | LS5 | 2016-11-09 16:47:05
7 | age | 24 | 2016-11-09 16:47:44
我不知道是否有人能够给我一些指点,基于上述数据,我想按ID 2查询,为每个唯一的field_name返回一行(如果多个行存在于具有相同field_name的相同ID下,则只返回具有最新时间戳的行)。
我已经设法几乎通过对field_name进行分组来达到此目的,它将返回唯一行的列表,但不一定是最新的行。
SELECT * FROM fragment WHERE (id = :id) GROUP BY field_name
我真的是在正是我应该做的事情在这里,我怎么能适应沿着MAX(时间戳)在此查询线的东西任何指针感激,
非常感谢!
考虑你首先需要一组数据给每个ID,FieldName和最大时间戳。 (生成该集)作为内联视图(B下面)。然后,将这个集合(B)加回到你的基本集合中,允许内部连接消除不需要的行。
SELECT A.ID, A.field_name, A.field_value, A.timestamp
FROM Table A
INNER JOIN (SELECT ID, field_name, MAX(timestamp) TS
FROM table
GROUP BY ID, field_name) B
on A.ID = B.ID
and A.field_name = B.field_name
and A.timestamp = B.TS
的MySQL之外,这可能使用窗口/分析功能,你将能够行号分配给每个记录和消除这些> 1是这样做....
SELECT B.*
FROM (SELECT A.ID
, A.field_name
, A.field_Vale
, A.timestamp
, Rownumber() over (Order by A.timestamp Desc) RN
FROM Table A) B
WHERE B.RN = 1
或使用交叉限制或顶部应用。
的Simpliest的方式来做到:
SELECT *
FROM fragment fra1
WHERE (id = :id)
and timestamp = (select max(timestamp)
from fragment fra2
where fra2.id = fra1.id
and fra2.field_name = fra1.field_name)
GROUP BY field_name
你需要在内部select中包含'field_name'。 –
为什么外层组合(在'select *'上没有聚合)?否则,相关的子查询看起来好像会起作用。 – xQbert
检查编辑:你不能把两个字段放在一个'='比较中 –
感谢很多的例子,我加你的逻辑,我的查询,以及B(套)下我还添加了一个WHERE在我想要的ID通过返回,非常感谢解释和其他例子,我当然只在这里使用MySQL,但非常清晰,谢谢。 –