2010-04-21 4 views
1

Hé les gars J'ai une requête qui trouve actuellement le dernier commentaire pour chacun des sujets d'un utilisateur, puis ordonne les sujets selon l'horodatage de ce commentaire. Ce que je veux faire, c'est développer l'utilisation de cette requête et imprimer le dernier commentaire pour chaque sujet. Le problème avec cette requête est que, bien qu'elle ordonne les sujets correctement, elle imprime des commentaires apparemment aléatoires pour chaque sujet. J'essaye d'implémenter une sous-requête mais je ne suis pas sûr de savoir comment l'aborder. Je pensais que je devais en quelque sorte utiliser cette requête pour obtenir les commentaires. Si quelqu'un a des idées, je l'apprécierais vraiment.Besoin d'aide pour une sous-requête/groupe/commande (obtenir le dernier commentaire pour chaque sujet commandé)

Voici ce que je pense que je dois ajouter

SELECT * FROM comments where topic_id='$topic_id' ORDER BY timestamp DESC LIMIT 1 

Voici la requête que je dois modifier

SELECT topic.topic_title, topic.content_type, topic.subject_id, topic.creator, topic.description, topic.topic_id,comments.message,comments.user 
     FROM comments 
     JOIN topic ON topic.topic_id = comments.topic_id 
     WHERE topic.creator = '$user' AND comments.timestamp > $week 
     GROUP BY topic_id ORDER BY MAX(comments.timestamp) DESC 

Répondre

2

Voici un exemple du plus grand-n-par groupe problème, qui est sur le débordement de pile fréquemment. Suivez l'étiquette pour plus d'exemples.

SELECT t.topic_title, t.content_type, t.subject_id, t.creator, t.description, 
    t.topic_id, c1.message, c1.user 
FROM topic t 
JOIN comments c1 ON (t.topic_id = c1.topic_id) 
LEFT OUTER JOIN comments c2 
    ON (t.topic_id = c2.topic_id AND c1.timestamp < c2.timestamp) 
WHERE t.creator = ? AND c1.timestamp > ? 
    AND c2.topic_id IS NULL 
ORDER BY c1.timestamp DESC; 

PS: Utiliser les paramètres de la requête (?) pour les valeurs dynamiques, afin de réduire le risque d'injection SQL.

+0

fonctionne comme un charme Bill, merci. Vous l'avez même fait sans une sous-requête qui, d'après ce que je comprends, peut avoir des problèmes de performance! En ce qui concerne la suggestion (?), Je comprends qu'ils sont utilisés dans les déclarations préparées. Je prévois de remplacer toutes mes déclarations mysql par des déclarations préparées mysqli, avez-vous de bonnes suggestions de références? – Scarface

+1

Je préfère utiliser PDO, l'utilisation des paramètres est beaucoup plus simple que mysqli. Ce n'est pas si difficile, il y a de bons exemples dans les docs, par ex. http://php.net/manual/fr/pdo.prepare.php –

+0

Merci encore Bill. – Scarface

0

Je ne sais pas ce que votre semaine $ var fait, mais J'espère que la date est formatée.

Que pensez-vous de cela? Je soupçonne que ce sera lent, mais c'est la première chose qui vient à l'esprit:

SELECT t.topic_title, t.content_type, t.subject_id, t.creator, 
    t.description, t.topic_id, c.message, c.user 
FROM topic t 
INNER JOIN comments c 
    ON t.topic_id = c.topic_id 
    AND c.comment_id = (select max(c2.comment_id) 
        from comments c2 
        where c2.topic_id = topic.topic_id) 
WHERE t.creator = '$user' 
    AND c.timestamp > $week 
0
select t.topic_title, t.content_type, t.subject_id, t.creator, t.description, t.topic_id, c.message, c.user 
from comments c 
inner join (
    SELECT cc.topic_id, max(cc.timestamp) as MaxTimestamp 
    FROM comments cc 
    inner JOIN topic t ON t.topic_id = cc.topic_id 
    WHERE t.creator = '$user' AND cc.timestamp > $week  
    group by cc.topic_id 
) cm on c.topic_id = cm.topic_id and c.timestamp = cm.MaxTimestamp 
inner JOIN topic t ON t.topic_id = c.topic_id 
Questions connexes