J'ai un script que j'ai écrit i pendant le retour pour commentaires, mais c'est seulement un seul fileté. J'aimerais que cela soit multi-fileté, mais seulement comme un utilisateur peut répondre à un commentaire, aucun utilisateur peut répondre à un commentaire d'un commentaire. Afin que les fils ne soient que deux profondes. P>
Actuellement, je stocke actuellement un La seule façon dont je peux penser à faire les commentaires multi-threads, est d'avoir un champ Il doit y avoir une meilleure façon. Des idées à ce sujet? Ou des tutoriels? p> COMMENT_ID code> contre un
user_id code> dans ma base de données. p>
parent code> dans la table des commentaires. Mais si je le fais, alors lorsque je sélectionne les commentaires avec PHP, je devrai effectuer une autre commande de sélection pour sélectionner les commentaires enfants (le cas échéant) pour chaque commentaire. Semble être beaucoup de travail sur la base de données. P>
4 Réponses :
Il y a trois (quatre) possibilités alternatives:
une requête recuë forte> pour sélectionner tous les commentaires en fonction de leurs identifiants parent. Ceci est pris en charge par de nombreux produits de base de données et la syntaxe dépend du type de base de données. Vérifiez les documents pour plus d'informations (recherche de 'récursif'). P> li>
Si vous stockez l'ID d'article STRAND> dans chaque commentaire (sous-), vous pouvez simplement sélectionner tous les commentaires avec l'ID d'article dans une requête de sélection régulière. Vous pouvez utiliser les identifiants parent pour afficher correctement les commentaires de la page sous le bon commentaire parent: p>
SELECT * FROM comments WHERE parent_id = :article_id UNION ALL SELECT * FROM comments WHERE parent_id IN (SELECT id FROM comments WHERE parent_id = :article_id)
Si vous n'avez besoin que de deux niveaux de commentaires, vous pouvez utiliser une étendue Il est également possible d'utiliser Union tout fort> pour combiner deux questions qui ont les mêmes colonnes, mais que je suppose que toutes les données proviennent de la même table, il n'y a probablement pas besoin de il (voir l'étendue où la clause ci-dessus): p>
SELECT * FROM comments
WHERE parent_id = :article_id
OR parent_id IN (SELECT id FROM comments WHERE parent_id = :article_id)
SELECT * FROM comments WHERE article_id = :article_id
S'il vous plaît pourriez-vous laisser tomber un exemple de vie réel du code PHP et l'ensemble de résultats ... Je lisais votre réponse pendant des heures et je ne peux pas vraiment comprendre comment le coder ... merci
@VyRenMedia Je suppose que vous essayez d'implémenter l'option 2. Je ne vous fournirai pas un guide complet de mise en œuvre, mais peut-être que cela aidera:
Cette requête pourrait fonctionner pour vous (je ne connaissais pas votre structure, donc je l'ai deviné):
SELECT * FROM comments a LEFT JOIN comments b ON a.comment_id = b.parent_coment_id LEFT JOIN comments c ON b.comment_id = c.parent_coment_id WHERE a.comment_id <> b.comment_id AND a.comment_id <> c.comment_id AND b.comment_id <> c.comment_id;
Cela semble à peu près bien. Je suppose que la seconde rejoignez-la et deuxièmement, je dois rejoindre le 3ème niveau de commentaire?
Notez que cela fonctionne au plus 3 niveaux de commentaires et ne filtre pas l'article réel que je suppose serait utile.
Hmm. Cela ajoute à la fin. Je suis décroché pour une méthode de sélection, mais les avoir comme une rangée séparée.
Ensuite, vous avez besoin d'un syndicat au lieu d'une jointure (ou d'une requête récursive)
1 La requête est suffisante pour cela, il vous suffit de boucler les données et de le stocker dans une matrice correctement, puis vous bouclez le tableau et affichez les commentaires. P>
Qui est plus d'une requête! C'est comme ça que je l'exerties de toute façon, je cherche de meilleures façons
Vous parliez d'utiliser une autre déclaration de sélection et je vous ai donné une meilleure façon.
Aucune solution n'utilisera toujours plusieurs sélection. Merci d'avoir répondu.
Si vous stockez l'ID d'article pour chaque commentaire, vous devez avoir exactement une instruction B> Sélectionner, nommément: Sélectionnez * dans le commentaire où article_id =: article_id code>
Ma solution utilise 1 et pas plus de 1 requêtes.
Ceci est une utilisation courante pour les données hiérarchiques ou de structure arborescente. J'ai écrit une réponse populaire à cette question de dépassement de la pile: Quelle est la manière la plus efficace / élégante d'analyser une table plate dans un arbre?
J'ai également écrit une présentation décrivant des alternatives pour les données structurées par arborescence: Modèles de données hiérarchiques avec SQL et PHP . P> Une autre solution qui n'est pas incluse dans ma présentation est la façon dont Slashdot fait des commentaires filetés. Ils utilisent une colonne parent code> comme vous le faites, chaque commentaire référence le commentaire qu'il répond à. Mais ensuite, ils incluent également une colonne code> racine code> afin que chaque commentaire connaisse le message qu'il appartient. Il y a rarement plus de quelques centaines de commentaires sur un poteau donné et vous souhaitez généralement obtenir tout l'arbre des commentaires pour un poste donné commençant en haut du thread de commentaire: P>
SELECT * FROM comments WHERE root = 1234;
Je sais que c'est un ancien poste, mais je me métisais avec la méthode que vous avez décrite comment cela fonctionnerait si vous aviez un poste avec des commentaires dans les milliers, vous ne sélectionneriez évidemment pas toutes les lignes, cependant, si vous avez utilisé une limite, vous perdriez l'arbre. structure ... y a-t-il un moyen de contourner ça? ... Cornue Corde J
@jon, vous pouvez utiliser la limite mais commander à la date du commentaire. Donc, vous obtiendriez les fils de commentaires les plus anciens. Ensuite, si l'utilisateur souhaite développer des threads, ils pourraient le demander, mais par défaut, ils ne verraient qu'un sous-ensemble de la discussion. Si vous voulez plus de détails, téléchargez la source SLASHDOT et voyez comment elles le font. slashcode.com
Merci pour votre réponse, cependant, si je vous comprends correctement, cela ne montrerait que les threads de commentaire originaux, puis s'ils souhaitaient élargir un thread de commentaire pour voir les réponses que vous feriez alors une sélection sur ce thread de commentaire, mais je suis vraiment Voulant également montrer les réponses des threades de commentaire dans la première requête, mais aussi être capable de limiter? .. Est-ce que cela est possible en utilisant la hiérarchie de l'adjacence?
@jon, non, ce n'est pas possible dans la hiérarchie d'adjacence dans une requête si vous utilisez MySQL et que vous souhaitez prendre en charge la profondeur arbitraire des threads de réponse de commentaire. C'est pourquoi les gens ont mis au point des moyens alternatifs de stocker des données hiérarchiques (voir ma présentation que j'ai liée). D'autres bases de données portent sur des requêtes récursives avec des expressions de table communes, il peut donc être possible.
Merci pour votre aide continue ... J'ai examiné votre article relié ci-dessus et de ce que j'ai compris (j'apprends toujours!), bien qu'ils soient vraiment des moyens très intelligents de stocker des données héritachiques, les méthodes de l'adjacence ressemblent à la Meilleure méthode pour stocker quelque chose comme des commentaires avec des réponses ... dans la mesure où les autres techniques nécessiteraient des mises à jour très complexes lorsqu'un utilisateur a publié une réponse. J'ai également pris un regard plus étroit sur Facebook et YouTube Commentaires .............
Il semble que YouTube n'affiche pas les réponses aux commentaires dans un format d'arborescence et Facebook que Facebook ne laisse répondre qu'à une profondeur ... Je suppose que s'ils ne sont pas incapables d'afficher des réponses de commentaire dans un affichage d'arborescence multi-profondeurs, il n'est probablement pas nécessaire ... et je suppose que c'est en partie parce que les problèmes décrits ci-dessus ... Merci encore pour votre facture d'aide .. Cordialement J
Sans lire la question du contexte, la question n'a absolument pas de sens puisque "Multi-fileté" et "commentaires" se réfèrent généralement à certains autres.