2009-06-10 7 views
1
CREATE TABLE `comments` (
    `comment_id` int(11) NOT NULL AUTO_INCREMENT, 
    `comment_parent_id` int(11) NOT NULL DEFAULT '0', 
    `user_id` int(11) NOT NULL DEFAULT '0', 
    `comment_text` varchar(200) NOT NULL DEFAULT '', 
    `comment_created` int(20) NOT NULL DEFAULT '0', 
    `comment_updated` int(20) NOT NULL DEFAULT '0', 
    `comment_replies_count` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`comment_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 

Chaque commentaire peut avoir plusieurs réponses, cependant, les réponses ne peuvent pas être répondues. Ainsi, lorsque quelqu'un répond à un commentaire, la ligne qu'il insère aura l'ID du commentaire auquel il a répondu dans la colonne de l'ID parent.MySQL SELECT avec une condition aide

Je voudrais récupérer tous les commentaires et si le commentaire a des réponses, je voudrais récupérer la dernière réponse.

SELECT c1.* 
FROM comments c1 
WHERE comment_parent_id = '0' 
ORDER BY comment_created DESC; 

So if c1.comment_replies_count > 0 I would like to... 

SELECT c2.* 
FROM comments c2 
WHERE comment_parent_id = c1.comment_id 
ORDER BY comment_created DESC Limit 1; 

Est-ce que cela peut être réalisé en 1 requête? Ou est-il préférable de faire un autre appel à la base de données, pendant l'instruction php loop, pour récupérer la dernière réponse au commentaire?

Merci d'avance et s'il vous plaît pardonnez mon ignorance que j'apprends encore.

Répondre

0

Essayez une sous-sélection:

SELECT * FROM comments WHERE comment_parent_id in (
SELECT c1.comment_id 
FROM comments c1 
WHERE c1.comment_parent_id = '0' 
AND c1.comment_replies_count > 0 
ORDER BY comment_created DESC) 
ORDER BY comment_created DESC Limit 1; 
2

Vous pouvez joindre la table sur lui-même:

SELECT c1.*, c2.*, MAX(c2.comment_id) 
FROM comments c1 LEFT JOIN comments c2 ON c1.comment_id = c2.comment_parent_id 
WHERE c1.comment_parent_id = '0' 
GROUP BY c1.comment_id 
ORDER BY c1.comment_created DESC 
+0

Dang, me battre pour elle. –

+0

Cela fonctionne un peu, mais il ne récupère pas la dernière réponse - toujours la première. par exemple: commentaire (ID 1, parent ID 0, le texte "Bonjour") première réponse (ID 2, parent ID 1, le texte "Répondre au commentaire 1") deuxième réponse (ID 3, parent ID 1, text "Une autre réponse au commentaire 1") Même si MAX renvoie 3, il renvoie l'ID et le texte de la première réponse. – Seth

+0

Essayez d'ajouter une clause à la clause WHERE pour comparer MAX() à c2.comment_id. – acrosman