2015-04-12 66 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

相關問題