查询最新版本的行

时间:2012-05-12 21:59:34

标签: sql query-optimization

我有一个数据库表设置如下:

copy_blocks
id (auto-increment int)
content (text)
parent_id (int)

第一次插入副本时,parent_id设置为自身。例如:

copy_blocks
id    content        parent_id
1     Hello, World   1

当用户更新该副本时,会插入新行,但这些行始终指向副本块的第一个版本。

copy_blocks
id    content         parent_id
2     Hello, World!   1
3     Heya, World!!   1

以这种方式构建事物允许我查询内容的特定版本,或查找父副本块,然后查找最新版本。 (在这种情况下,版本#3)

所以这是我的问题:任何人都可以提出一个始终返回每个内容块的最新版本的查询吗?理想情况下,查询将返回以下结果:

id    content         parent_id
3     Heya, World!!   1

我觉得这与加入自己有关。如果没有至少两个不同的查询或服务器端代码,我无法想到如何做到这一点。

2 个答案:

答案 0 :(得分:2)

试试这个:

select id, content, parent_id
  from copy_blocks
 where (id, parent_id) in (
     select max(id), parent_id from copy_blocks group by parent_id
 )

如果您的表太大,查询可能会变慢。如果是这种情况,请尝试添加一些索引来改进它。

答案 1 :(得分:1)

还有一个选择:

SELECT 
      c.*
FROM 
        ( SELECT parent_id
               , MAX(id) AS id
          FROM copy_blocks
          GROUP BY parent_id
        ) AS dc
    JOIN
        copy_blocks AS c
      ON 
        (c.parent_id, c.id) = (dc.parent_id, dc.id)