id | message | reply id | date 1 | my new app.. | 0 | 10 / 10 / 2009 (latest message on top, follow by replies) 5 | love ur app.. | 1 | 11 / 10 / 2009 (this should show under the main message) 6 | another comm | 1 | 12 / 10 / 2009 2 | application 2 | 0 | 09 / 10 / 2009 3 | reply of 2 | 2 | 11 / 10 / 2009 I want to show latest comments and its replies after the main comments. Obviously the replies will have latest date, so I can't sort it by date, because replies will be on top of main. I'm not sure how to do this properly with one query. Any idea's please. database dump: http://pastie.org/576963
4 Réponses :
....
Puisque vous ne faites pas clairement ce qui distingue un "commentaire principal", c'est tout ce que je peux faire pour vous. Si, comme dans votre exemple, tous les commentaires principaux avaient un Notez que l'utilisation de la déclaration de cas plutôt que de simplement commander par (Oh, si je comprends votre schéma, Commander par CODE> (un prédicat qui est vrai pour "Commentaires principaux" mais non des suivi) em> Desc, date de descente code> p> p> P>
Répondre_id code> de zéro, cela pourrait être: p>
Commander par Case Répondre_id = 0 puis 1 autre 0 End Desc, date Desc code> P>
Répondre_id code> est nécessaire, car vous souhaitez que la première expression ait la même valeur (nommément zéro) pour tous les messages non principaux, de sorte que Ils sont triés exclusivement par la deuxième expression, date code>. p>
Répondre_id code> devrait vraiment être nommé in_repky_to_id code>.) p>.
C'est une technique utile que j'utilise souvent.
Eh bien, je veux que les derniers messages principaux (Répondre_id = 0) soient en haut puis à droite sous chaque réponse des messages devraient aller. - Message principal - Message de réponse - Message principal - Message de réponse Essayez le fichier de vidage SQL suivant, voyez si votre requête fonctionne, ne fonctionne pas pour moi: Pastie.org/578558
Veuillez également regarder la date, ne regardez pas l'identifiant, ID ne serait pas entier, il sera câblé comme YouTube (ID: CXewvewed)
Je ne suis pas sûr de vos besoins, alors ma réponse est une abstraction ...
Le max - peut avoir besoin d'être un min (encore une fois, je ne suis pas clair sur vos exigences exactes) Si vous utilisez SQL Server, il y a une fonction appelée sur Row_Number que vous pouviez utiliser aussi. p> p>
Je vais deviner que "ID de réponse" est 0 pour les articles et est le numéro d'article des commentaires. Si c'est votre conception, cela devrait fonctionner: ajouté: strong> Merci pour les informations supplémentaires dans votre commentaire. Pour mettre les résultats dans l'ordre dans lequel vous le souhaitez n'est pas si facile, car la première clé de commande est la créature_date du poste de démarrage. Ce n'est pas dans la ligne de données, vous avez donc besoin d'une jointure. Voici mes meilleures suppositions basées sur les informations supplémentaires (qui ne sont toujours pas assez complètes pour me garder de deviner): p> Vous devrez peut-être régler la syntaxe de postgre. J'ai testé cela dans SQL Server. P> Si cela ne fait toujours pas ce que vous voulez, s'il vous plaît être précis sur la manière dont vous voulez les données. De préférence, dites-moi l'ordre "id" que je devrais voir pour les données de votre fichier de vidage et aussi em> expliquer la base de cet ordre. Voici ce que j'ai fait: p> Tous les messages dans un thread (thread = Un message et ses commentaires) doivent être regroupés. P> LI>
Dans un fil, mettez le message sur le dessus, suivi de ses commentaires dans l'ordre chronologique inverse. Le fil avec le plus récent créé / _Date doit d'abord être, puis le fil avec la deuxième plus récente créée_date, etc. (Vos exemples de données ont eu beaucoup de commentaires avec le même créé_date, donc j'ai utilisé "ID" comme clé de commande secondaire pour les commentaires dans un fil.) P> li>
ol> Remarque: em> strong> Votre décharge indique que créé_date est mise à jour sur Current_TimeStamp si un message est modifié. S'il s'agit d'une carte de messagerie en direct, sachez que cela pourrait causer des commentaires avant em> le message parent, et cela signifie qu'un thread restera en haut s'il est fréquemment modifié (même sans changement réel à son texte). (Ce n'est pas pertinent pour ma solution, mais je pensais que c'était la peine de noter.) P> 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 faire des mises à jour de Thread-Starters aux commentaires, mais je pense que cela en vaut la peine de ne pas avoir de beaucoup de mises à jour, car la requête peut être beaucoup plus simple. Je n'ai pas testé cela parce que cela nécessite plusieurs modifications à votre conception: p> en théorie, ceci La recherche devrait être évaluée juste une fois pour la requête, mais si ce n'est pas dans la pratique, vous pouvez le précaliser comme :: thisonEnthreadIdid et ajouter p> pour la deuxième solution, en supposant que vous précompute Encore une fois, essayez p>
where coalesce(id,reply_id) = ::thisOneThreadID
Eh bien, je veux que les derniers messages principaux (Répondre_id = 0) soient en haut puis à droite sous chaque réponse des messages devraient aller. - Message principal - Message de réponse - Message principal - Message de réponse Essayez le fichier de vidage SQL suivant, voyez si votre requête fonctionne, ne fonctionne pas pour moi: Pastie.org/578558
Veuillez également regarder la date, ne regardez pas l'identifiant, ID ne serait pas entier, il sera câblé comme YouTube (ID: CXewvewed)
Je suppose toujours de savoir ce que vos données signifie. La députée n'aide pas beaucoup à moins que vous fournissez le résultat que vous souhaitez voir à partir de ces données, ou une description claire de la commande que vous souhaitez voir des résultats. Ce que je peux dire de votre commentaire, c'est que vous aurez besoin d'une jointure. Les lignes de la table ne contiennent pas assez d'informations pour la commande pour résoudre le problème sans joindre, car les messages doivent être commandés en fonction de la date du message parent. L'ID, pas la date est stockée dans la ligne. Je vais ajouter à ma réponse d'origine.
Cela l'a résolu :). Merci beaucoup. Maintenant, il ne reste que la seule chose qui tire le groupe complet avec une seule pièce d'identité. Hmmm
Steve, s'il vous plaît montrer moi le SJBM où votre première réponse, SELECT * à partir de votre commande de votre carte par cas lorsque "Répondre ID" = 0 puis identifiant «ID de réponse», identifiant code> fonctionne réellement.
Ma première réponse retourne [Démarreur de fil avec ID le plus bas], [Commentaires à (Thread-Starter avec identifiant le plus bas) dans l'ordre d'identité], [Démarreur de thread-Starter avec une deuxième idée la plus basse], [Commentaires à (Thread-Starter avec le deuxième identifiant le plus bas ) Dans l'ordre d'identité], ...
@basit: Voir la section n ° 2 ajoutée de cette réponse concernant votre commentaire à propos de Tiring One Reply_ID
@TPDI: SQL Server, par exemple. Cette commande par devrait fonctionner pour tout SGBDM qui permet la commande par clause que vous avez publiée le 8 août. Êtes-vous à tort en supposant que les "caractères indiquent une chaîne? Ce serait un problème car la chaîne" ID de réponse "ne représente pas un entier. Cependant, il n'y a pas de chaînes dans ma commande; dans la standard SQL, les doubles citations sont des objectifs Nom des délimiteurs, pas des délimiteurs à chaîne. Ici, ils délimitent le nom de la colonne "ID de réponse", qui a une place dedans. Est-ce que ma commande en panne pour vous sur un SGBD en particulier? Faites-moi savoir, car j'avais peut-être manqué d'autres détails.
Voici un lien sur la représentation des données hiérarchiques dans une base de données relationnelle. http: //dev.mysql.com/tech-resources/articles/hierarchical-data.html
Le gist Être étant, vous devez vous joindre à la table pour autant de niveaux de profondeur que vous souhaitez aller.
L'exemple de données fournis n'était que deux niveaux profond. P> Les informations de l'article parent seront dans la F1. * Les colonnes et les informations relatives aux enfants (répondements) seront dans la F2. * colonnes. p> p>
Exemple Si confus: Pastie.org/577011