我有一个如下所示的数据库:
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中做些什么来实现这个目标?
每个表的单独版本是否可以用于修订?
答案 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'