通过SQL从表中获取最新版本

时间:2012-02-24 16:06:55

标签: sql

我有一个如下所示的数据库:

ID   parent   name              description           _record_status   _log_user   _log_timestamp         _log_type 
--------------------------------------------------------------------------------------------------------------------
1    1        This is a rwo!    Test content          active           1           2012-01-29 15:49:21    create
2    1        This is a row!    Test Content          active           1           2012-01-29 15:52:14    revision
3    3        Another record!   More content          active           1           2012-01-29 15:58:43    create    
4    4        Deleted Record    More content          active           1           2012-01-29 15:58:43    create    
5    4        Deleted Record    More content          deleted          1           2012-01-29 15:58:43    destroy

我希望能够为每条记录选择最新的行,而不删除记录。例如,我期望的输出是:

ID   name
------------------
2    This is a row!
3    Another Record!

有没有办法通过有效的SQL来做到这一点,如果没有,我想在PHP中做些什么来实现这个目标?

每个表的单独版本是否可以用于修订?

2 个答案:

答案 0 :(得分:3)

您首先获得parent的最高记录,然后排除deleted以外的任何内容:

SELECT YourTable.ID, YourTable.name
FROM YourTable INNER JOIN (
  SELECT parent, MAX(_log_timestamp) MaxLogTS
  FROM YourTable
  GROUP BY parent) T ON YourTable.parent = T.parent
                    AND YourTable._log_timestamp = T.MaxLogTS
WHERE YourTable._record_status != 'deleted'

如果您知道ID值始终按升序时间顺序排列,则可以稍微优化一下。然后,您可以将MAX记录比较基于ID,而不是日期和时间值。

答案 1 :(得分:0)

假设您使用的是MySQL,请尝试以下方法:

select * from
(select id, name, _record_status from
 (select parent, id, name, _record_status
  from your_table
  order by parent, _log_timestamp desc) v
 group by parent) q
where _record_status <> 'deleted'