2015-04-12 82 views
1

我有一个表格,它包含文章和修订版,类似于wordpress的版本。如何在mysql中获取最新的行(post)修订版本?

id, parent_id, ... 

每个根帖子都会有NULL作为parent_id。我正在寻找一个查询来获取他们最新版本中的所有帖子。这可能是parent_id = NULL或帖子修订版的原始帖子。

我正在构建的应用程序基于laravel,也许有一种优雅的方式来解决这个问题的口才?

感谢您的帮助!

+0

使用“ORDER BY ID DESC”我抬头一看WordPress的是怎么做的,有一个附加的分类(修订/出版)。这样他们可以过滤所有发布的内容,并确保这些是他们正在寻找的帖子。有没有办法解决这个问题? – rootman

回答

0

使用时间戳保存修订(如果您在创建时使用Laravel的schema builder使用$table->timestamps())并按created_at的降序排列。

+0

我已经得到了这个问题,我只需要每个帖子按照parent_id或id分组,每个帖子一行。我无法确定是否有修订,因此在许多情况下,parent_id可能为NULL。这样我就不能使用Distinct或Group By。我可以先得到所有的ID然后运行一个查询循环,但是那个n + 1问题是我想要避免的问题 – rootman

1

最大的元素是根元素或子元素。要检查一个根元素是否是最大的行,您可以验证它没有子元素(即另一行指向它的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) 
+0

我可以看到它变得复杂了,我想添加一个当前的tinyint会简化很多事情,那样我只能选择当前值= 1,并在检出较旧的版本时保留以后的修订版。但非常感谢您的建议! – rootman

+0

@rootman我使用group by添加了更简单的版本,但当前的标志可能是您最好的选择 – FuzzyTree

0

我没有100%你的问题,但如果你想订购他们,在SQL

相关问题