Domyślam się, że „identyfikator odpowiedzi” to 0 w przypadku artykułów i numer artykułu w przypadku komentarzy. Jeśli to Twój projekt, to powinno działać:
select * from yourTable
order by
case when "reply id" = 0 then id else "reply id" end, id
DODANO: Dziękujemy za dodatkowe informacje w Twoim komentarzu. Umieszczenie wyników w żądanej kolejności nie jest takie proste, ponieważ pierwszym kluczem porządkującym jest data_utworzenia wpisu rozpoczynającego wątek. Nie ma tego w wierszu danych, więc potrzebujesz sprzężenia. Oto moje najlepsze przypuszczenie oparte na dodatkowych informacjach (które wciąż nie są wystarczająco kompletne, abym nie zgadł):
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;
Może być konieczne dostosowanie składni postgre. Przetestowałem to w SQL Server.
Jeśli to nadal nie działa tak, jak chcesz, określ dokładnie, w jaki sposób chcesz odzyskać dane. Najlepiej podaj kolejność „id”, którą powinienem zobaczyć w przypadku danych w pliku zrzutu, a także również wyjaśnij podstawę tego zamówienia. Oto, co zrobiłem:
-
Wszystkie wiadomości w wątku (wątek =wiadomość i jej komentarze) powinny być zgrupowane.
-
W wątku umieść wiadomość na górze, a następnie jej komentarze w odwrotnej kolejności chronologicznej. Wątek z najnowszą utworzoną/_date powinien być pierwszy, następnie wątek z drugą najnowszą datą utworzoną i tak dalej. (Twoje przykładowe dane zawierały wiele komentarzy z tą samą datą utworzoną, więc użyłem "id" jako drugorzędnego klucza kolejności dla komentarzy w wątku.)
Uwaga: Twój zrzut wskazuje, że created_date został zaktualizowany do CURRENT_TIMESTAMP, jeśli post zostanie zmodyfikowany. Jeśli jest to tablica ogłoszeń na żywo, pamiętaj, że może to spowodować, że komentarze będą datowane przed wiadomości nadrzędnej, a to oznacza, że wątek pozostanie na wierzchu, jeśli jest często modyfikowany (nawet bez faktycznej zmiany jego tekstu). (To nie dotyczy mojego rozwiązania, ale pomyślałem, że warto to zauważyć).
Ponieważ wymagane jest sprzężenie, to zapytanie będzie teraz znacznie wolniejsze. Moja sugestia:zachowaj dwie kolumny dat, „thread_last_modified” i „item_last_modified”. Będziesz musiał kaskadować aktualizacje od rozpoczynających wątki do komentarzy, ale myślę, że warto, jeśli nie ma wielu aktualizacji, ponieważ zapytanie może być znacznie prostsze. Nie testowałem tego, ponieważ wymaga to kilku zmian w twoim projekcie:
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;
DODANO #2 :Jeśli chcesz tylko wątek zawierający komentarz o identyfikatorze ::thisOne, myślę, że możesz dodać tę linię między klauzulami ON i ORDER BY (dla mojego pierwszego dodanego rozwiązania, złącze):
where parentfeed.id = (
select coalesce(reply_id,id)
from feed
where id = ::thisOne
)
Teoretycznie to wyszukiwanie powinno zostać ocenione tylko raz dla zapytania, ale jeśli nie jest to w praktyce, możesz wstępnie obliczyć jako ::thisOneThreadID i dodać
where parentfeed.id = ::thisOneThreadID
W przypadku drugiego rozwiązania, zakładając, że ponownie wykonujesz obliczenia wstępne, spróbuj
where coalesce(id,reply_id) = ::thisOneThreadID
Przy okazji, podejrzewam, że oba moje rozwiązania połączą wątki, które zostały ostatnio zmodyfikowane dokładnie w tym samym czasie...