Je suppose que "réponse ID" est 0 pour les articles et est le numéro d'article pour les commentaires. Si tel est votre conception, cela devrait fonctionner:
select * from yourTable
order by
case when "reply id" = 0 then id else "reply id" end, id
AJOUTÉE: Merci pour les informations supplémentaires dans votre commentaire. Mettre les résultats dans l'ordre que vous voulez n'est pas si facile, car la première clé de commande est le created_date de la publication du thread-starter. Ce n'est pas dans la ligne de données, vous avez donc besoin d'une jointure. Voici ma meilleure estimation basée sur les informations supplémentaires (ce qui est pas encore assez complet pour me garder de deviner):
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;
Vous devrez peut-être modifier la syntaxe pour postgre. J'ai testé cela dans SQL Server.
Si cela ne vous convient toujours pas, veuillez préciser comment vous souhaitez récupérer les données. De préférence, dites-moi l'ordre "id" que je devrais voir pour les données dans votre fichier de vidage, et aussi expliquer la base de cette commande. Voici ce que j'ai fait:
Tous les messages d'un fil de discussion (fil = un message et ses commentaires) doivent être regroupés. Dans un fil, placez le message en haut, suivi de ses commentaires dans l'ordre chronologique inverse. Le thread avec le plus récent/_date créé doit être d'abord, puis le thread avec le second plus récent created_date, et ainsi de suite.(Vos données d'échantillon ont eu beaucoup de commentaires avec le même CREATED_DATE, donc j'ai utilisé « id » comme une clé de commande secondaire pour les commentaires dans un fil.)
Note: Votre décharge indique que CREATED_DATE est mis à jour à CURRENT_TIMESTAMP si un message est modifié. S'il s'agit d'un forum de discussion en direct, sachez que cela peut entraîner la date avant le message parent, ce qui signifie qu'un thread restera en haut s'il est fréquemment modifié (même sans modification réelle de son texte). (Ce n'est pas pertinent pour ma solution, mais je pensais que cela valait la peine d'être noté.)
Parce qu'une jointure est requise, cette requête sera maintenant beaucoup plus lente. Ma suggestion: maintenir deux colonnes de date, "thread_last_modified" et "item_last_modified". Vous devrez mettre en cascade les mises à jour de thread-starters aux commentaires, mais je pense que ça vaut le coup s'il n'y a pas beaucoup de mises à jour, car la requête peut être beaucoup plus simple. Je ne l'ai pas testé car il nécessite plusieurs modifications à votre conception:
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;
AJOUTÉE # 2: Si vous ne souhaitez que le fil contenant le commentaire avec id :: thisOne, je pense que vous pouvez ajouter cette ligne entre la marche et la clause ORDER BY (pour ma première solution ajoutée, la jointure):
where parentfeed.id = (
select coalesce(reply_id,id)
from feed
where id = ::thisOne
)
en théorie, cette recherche devrait être évaluée qu'une seule fois pour la requête, mais si ce n'est pas dans la pratique, vous pouvez précalculer il as :: thisOneThreadID et ajouter
where parentfeed.id = ::thisOneThreadID
Pour la deuxième solution, en supposant que vous Précalculer à nouveau, essayez
where coalesce(id,reply_id) = ::thisOneThreadID
D'ailleurs, je soupçonne que mes deux solutions fusionner les discussions qui ont été modifié pour la dernière exactement au même moment ...
exemple si confus: http://pastie.org/577011 – Basit