我有一个数据库表设置如下:
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
我觉得这与加入自己有关。如果没有至少两个不同的查询或服务器端代码,我无法想到如何做到这一点。
答案 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)