0

我设置了一个数据库表,如下所示:

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

我觉得这与加入反对自己有关。如果没有至少两个不同的查询或服务器端代码,我想不出该怎么做。

4

2 回答 2

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
 )

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

于 2012-05-12T22:03:17.000 回答
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)
于 2012-05-12T22:17:25.800 回答