我有一个表格,它包含文章和修订版,类似于wordpress的版本。如何在mysql中获取最新的行(post)修订版本?
id, parent_id, ...
每个根帖子都会有NULL作为parent_id。我正在寻找一个查询来获取他们最新版本中的所有帖子。这可能是parent_id = NULL
或帖子修订版的原始帖子。
我正在构建的应用程序基于laravel,也许有一种优雅的方式来解决这个问题的口才?
感谢您的帮助!
我有一个表格,它包含文章和修订版,类似于wordpress的版本。如何在mysql中获取最新的行(post)修订版本?
id, parent_id, ...
每个根帖子都会有NULL作为parent_id。我正在寻找一个查询来获取他们最新版本中的所有帖子。这可能是parent_id = NULL
或帖子修订版的原始帖子。
我正在构建的应用程序基于laravel,也许有一种优雅的方式来解决这个问题的口才?
感谢您的帮助!
使用时间戳保存修订(如果您在创建时使用Laravel的schema builder使用$table->timestamps()
)并按created_at
的降序排列。
我已经得到了这个问题,我只需要每个帖子按照parent_id或id分组,每个帖子一行。我无法确定是否有修订,因此在许多情况下,parent_id可能为NULL。这样我就不能使用Distinct或Group By。我可以先得到所有的ID然后运行一个查询循环,但是那个n + 1问题是我想要避免的问题 – rootman
最大的元素是根元素或子元素。要检查一个根元素是否是最大的行,您可以验证它没有子元素(即另一行指向它的parent_id
确实是not exist
)。
要检查子元素是否是最大的元素,您可以验证另一个具有相同parent_id
和更大id
的子元素是not exist
。
select * from mytable t1 where (parent_id is null
and not exists (
select 1 from mytable t2
where t2.parent_id = t1.id
)) or (parent_id is not null
and not exists (
select 1 from mytable t2
where t2.id > t1.id
and t2.parent_id = t1.parent_id
))
编辑
您可以通过coalesce(parent_id,id)
为了得到孩子和家长到同一群组。
select coalesce(parent_id,id), max(id) from mytable
group by coalesce(parent_id,id)
我没有100%你的问题,但如果你想订购他们,在SQL
使用“ORDER BY ID DESC”我抬头一看WordPress的是怎么做的,有一个附加的分类(修订/出版)。这样他们可以过滤所有发布的内容,并确保这些是他们正在寻找的帖子。有没有办法解决这个问题? – rootman