Mysql
 sql >> Baza danych >  >> RDS >> Mysql

złożone zamówienie sql przez

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:

  1. Wszystkie wiadomości w wątku (wątek =wiadomość i jej komentarze) powinny być zgrupowane.

  2. 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...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyciek pamięci w PHP podczas pobierania dużego zbioru danych z MySQL

  2. LAST_DAY() Przykłady – MySQL

  3. MySQL w AWS EC2 - Jak się skaluje?

  4. Dlaczego DBI niejawnie zmienia liczby całkowite na łańcuchy?

  5. Jak zapisać ciąg tekstowy z podziałami wierszy w polu tekstowym bazy danych MySQL za pomocą PHP?