Mysql
 sql >> база данни >  >> RDS >> Mysql

комплексен sql подреждане по

Предполагам, че "идентификатор на отговора" е 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", който трябва да видя за данните във вашия файл за дъмп, и също обяснете основата на тази поръчка. Ето какво направих:

  1. Всички съобщения в нишката (нишка =съобщения и нейните коментари) трябва да бъдат групирани заедно.

  2. В рамките на нишка поставете съобщението отгоре, последвано от коментарите му в обратен хронологичен ред. Нишката с най-скоро създадена/_дата трябва да бъде първа, след това нишката с втората най-скоро създадена_дата и т.н. (Вашите примерни данни имаха много коментари с една и съща 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
)

На теория това търсене трябва да бъде оценено само веднъж за заявката, но ако не е на практика, можете да го изчислите предварително като ::thisOneThreadID и да добавите

where parentfeed.id = ::thisOneThreadID

За второто решение, ако приемем, че предварително изчислите отново, опитайте

where coalesce(id,reply_id) = ::thisOneThreadID

Между другото, подозирам, че и двете ми решения ще обединят нишки, които са били последно променени по едно и също време...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка (Код на грешка:1175) по време на изпълнение на команда за актуализиране на таблица с помощта на MySQL Workbench 5.2

  2. SQL:как се създава заявка в sql ред в този случай

  3. MySQL функция за определяне на близостта/обхвата на пощенския код

  4. MySQL:Много бавно актуализиране/вмъкване/изтриване на заявки, висящи на стъпка край на заявката

  5. как се преименува схема в MySQL