7
votes

Commentaires multi-filetés PHP?

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.

Actuellement, je stocke actuellement un COMMENT_ID contre un user_id dans ma base de données.

La seule façon dont je peux penser à faire les commentaires multi-threads, est d'avoir un champ parent 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.

Il doit y avoir une meilleure façon. Des idées à ce sujet? Ou des tutoriels?


1 commentaires

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.


4 Réponses :


16
votes

Il y a trois (quatre) possibilités alternatives:

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

  2. 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)
    
  3. Si vous n'avez besoin que de deux niveaux de commentaires, vous pouvez utiliser une étendue où forte> inclure à la fois les premiers niveaux et les commentaires de deuxième niveau: P>

    SELECT * FROM comments 
    WHERE parent_id = :article_id
    OR    parent_id IN (SELECT id FROM comments WHERE parent_id = :article_id)
    
  4. 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 article_id = :article_id
    


2 commentaires

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: blog.tcs.de/creating-trees-de-sql-queries-in-javaScript . Si vous avez besoin de plus d'aide, veuillez poster une nouvelle question.



1
votes

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;


4 commentaires

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)



2
votes

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.


5 commentaires

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 Sélectionner, nommément: Sélectionnez * dans le commentaire où article_id =: article_id


Ma solution utilise 1 et pas plus de 1 requêtes.



2
votes

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;


6 commentaires

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