我猜對於文章「reply id」爲0,並且是評論的文章編號。如果這是你的設計,這應該工作:
select * from yourTable
order by
case when "reply id" = 0 then id else "reply id" end, id
新增:感謝您對您的評論的附加信息。按照你想要的順序放置結果並不是那麼容易,因爲第一個排序鍵是線程啓動器帖子的created_date。這不在數據行中,所以你需要一個連接。這是基於附加信息我最好的猜測(這仍然是不夠完整的讓我從猜測):
select
f.id, f.user_id, f.type, f.reply_id, f.text, f.url, f.created_date,
coalesce(parentfeed.created_date,f.created_date) as thread_date
from feed as f left outer join feed as parentfeed
on f.reply_id = parentfeed.id
order by
thread_date desc,
case when f.reply_id = 0 then 0 else 1 end,
created_date desc, id;
您可能需要調整語法postgre。我在SQL Server中測試了這個。
如果這仍然沒有做到你想要的,請具體說明你希望如何恢復數據。最好告訴我,我應該看到您的轉儲文件中的數據的「id」順序,並且也是解釋了該順序的基礎。以下是我所做的:
應將線程(線程=消息及其註釋)中的所有消息組合在一起。
在一個線程中,將消息放在最上面,然後按照反向時間順序放置它的註釋。具有最近創建的/ _date的線程應該是第一個,然後是具有第二個最近的created_date的線程,依此類推。(你的樣本數據必須具有相同CREATED_DATE許多意見,所以我用「ID」作爲一個線程中的註釋輔助性的關鍵。)
注:轉儲表明CREATED_DATE是如果帖子被修改,則更新爲CURRENT_TIMESTAMP。如果這是一個實時留言板,請注意,這可能會導致註釋在父代消息之前被註明日期,並且這意味着如果頻繁修改(即使沒有對其文本進行實際更改),線程將保持在最前端。 (這與我的解決方案無關,但我認爲值得注意)。
因爲需要連接,所以此查詢現在會慢很多。我的建議:維護兩個日期列,「thread_last_modified」和「item_last_modified」。您將不得不將線程啓動器的更新級聯到註釋,但是如果沒有更新,我認爲這是值得的,因爲查詢可以更簡單。
select
id, user_id, type, reply_id, text, url, thread_last_modified, item_last_modified
from feed
order by
thread_last_modified desc,
case when f.reply_id = 0 then 0 else 1 end,
item_last_modified desc, id;
添加了#2:因爲它需要一些改變你的設計,我沒有測試過這一點,如果你想只包含與標識的評論:: thisOne,我想你可以添加此行的主題ON和ORDER BY子句之間(我的第一個加入的解決方案,加入):
where parentfeed.id = (
select coalesce(reply_id,id)
from feed
where id = ::thisOne
)
從理論上講,這個查詢應該只是一次查詢的評估,但如果它不是在實踐中,你可以預先計算它as :: thisOneThreadID並添加
where parentfeed.id = ::thisOneThreadID
對於第二種方案,假設你又預先計算,嘗試
where coalesce(id,reply_id) = ::thisOneThreadID
順便說一句,我懷疑我的兩個解決方案,將合併是最後一次在完全相同的時間修改線程...
示例如果困惑:http://pastie.org/577011 – Basit 2009-08-09 00:31:52