2010-12-15 5 views
1

J'ai une table de commentaires:Comment puis-je obtenir des résultats imbriqués à partir d'une table MySQL ET d'un lien vers une autre table?


comment_id int (11) Non auto_increment
profile_id int (11) Non
type char (1) latin1_swedish_ci Pas
parent_id int (11) Non
texte mediumtext latin1_swedish_ci Pas
datetime datetime Pas
vote_score int (11)


Où « type » peut être « un », un commentaire sur un article, ou « c », un commentaire sur un commentaire (une réponse)

« parent_id » dit si le commentaire est un enfant de article_id = 1 ou comment_id = 1

Il est lié à la table "profils" où comments.profile_id = profile.profile_id (donc je peux obtenir profile.first_name, par exemple)


LE DÉFI:

J'aimerais obtenir une requête SQL qui g moi ives les commentaires afin qu'ils seraient affichés:

commentaire 1 [type = a]

(réponse à un commentaire 1) [type = c]

(réponse à la écrire 2) [type = c]

commentaire 2 [type = a]

W Quelle requête SQL dois-je faire? (L'objectif est de retourner les résultats dans le bon ordre, donc je peux avoir une simple boucle php WHILE imprimer les résultats.)

Merci!

+0

Y a-t-il seulement un niveau de l'arbre (seuls les parents peuvent avoir des enfants), ou peut-il y en avoir plusieurs (les enfants peuvent aussi avoir des enfants)? – ircmaxell

+0

mise à jour: plusieurs niveaux. Les enfants peuvent avoir des enfants. Merci IRCmaxell – Ari

+0

Voir, par exemple, les commentaires ici: http://www.ted.com/talks/benjamin_zander_on_music_and_passion.html – Ari

Répondre

1

Je pense que vous pourriez être intéressé à lire cet article sur managing Hierarchical data in MySQL. En utilisant ce modèle, les requêtes pour faire des choses simples comme dans votre question sont simples aussi. Avec ce modèle, la structure de votre table serait ce qui suit:

comment_id int(11) No auto_increment 
article_id int(11) 
lft int NOT NULL 
rgt int NOT NULL 
profile_id int(11) No 
text mediumtext No 
datetime datetime No 
vote_score int(11) 

vos données d'exemple ressembleraient cette

comment_id article_id lft rgt profile_id text    datetime vote_score 
------------------------------------------------------------------------------ 
    1   1  1 6  ?  comment 1   ?  **** 
    2   1  2 3  ?  reply to comment1 ?   ** 
    3   1  4 5  ?  reply to comment2 ?  **** 
    4   2  1 2  ?  comment2    ?   * 

Maintenant, avec ce modèle, obtenir les commentaires dans l'ordre est très simple: Passer à ce modèle vous épargnera beaucoup de maux de tête récursifs je pense. S'amuser!

P.S: Êtes-vous suédois?O :-)

+0

Wow! Merci greg0ire! – Ari

0

Une façon de le faire:

SELECT pr.name_f,c1.comment_id AS comment_1, c1.profile_id AS profile_id_1, c1.type AS type_1, c1.parent_id AS parent_id_1, c1.text AS text_1, c1.datetime AS datetime_1, c1.vote_score AS score_1, c2.comment_id AS comment_2, c2.profile_id AS profile_id_2, c2.type AS type_2, c2.parent_id AS parent_id_2, c2.text AS text_2, c2.datetime AS datetime_2, c2.vote_score AS score_2 FROM profiles AS pr, comments AS c1 

LEFT JOIN mcomments AS c2 ON c2.parent_id=c1.comment_id AND c2.comment_idc1.comment_id 

WHERE c1.article_id = '1' AND (pr.profile_id=c1.profile_id OR pr.profile_id=c2.profile_id)

Ensuite simples tableaux PHP de comment_id années peuvent empêcher double/sous commentaires d'être affiché.

Je suis sûr qu'il y a un meilleur moyen?

+0

note: J'ai ajouté "article_id" à la base de données pour l'activer. – Ari

Questions connexes