Aide mysql sur une requete left outer join

Fermé
ekael - 1 mars 2011 à 11:20
 Utilisateur anonyme - 3 mars 2011 à 10:10
Bonjour,

je suis en train de créer un forum très simple (discussions, et pour chaque fil de discussions des commentaires)
je souhaite afficher une liste des fils de discussions triés par date descendante, et spécifier le nb de commentaires et le dernier commentaire déposé par ......... le ...........

j'ai deux tables simples Mysql

DISCUSSIONS
id_sujet - nom - message - date_discussion

COMMENTAIRES
id_commentaire - id_sujet - message - date_commentaire - id_user

j'ai cette requete :

SELECT SQL_NO_CACHE d.*,c.date_commentaire AS lastcomdate,c.id_user AS lastcomuser,COUNT(c.id_commentaire) AS nbcommentaires
FROM discussions d
LEFT OUTER JOIN 'commentaires' c ON d.id_sujet=c.id_sujet
WHERE
GROUP BY d.id_sujet
ORDER BY d.date_discussion DESC

LE PROBLEME:
cela marche bien, sauf que le lastcomdate et lastcomuser donne les infos du premier commentaire déposé et pas le dernier.
Y aurait il une clause à rajouter pour que ces infos soient prises pour le dernier commentaire ? (date_commentaire DESC )
j'ai essayé en rajoutant un ORDER BY c.date_commentaire DESC, mais cela ne marche pas.

Merci d'avance pour votre aide.

3 réponses

Utilisateur anonyme
1 mars 2011 à 16:02
Bonjour,

SELECT
c.id_user AS lastcomuser,
max(c.date_commentaire) AS lastcomdate,
COUNT(c.id_commentaire) AS nbcommentaires
FROM
discussions d
LEFT OUTER JOIN 'commentaires' c ON d.id_sujet=c.id_sujet
GROUP BY d.id_sujet
ORDER BY d.date_discussion DESC

Devrait fonctionner
0
ca marche pour la date mais pas pour l'id_user :(
merci quand même
0
Utilisateur anonyme
2 mars 2011 à 13:19
Bonjour,

Quel id_user voulez vous afficher ?
Le dernier user ayant posté un commentaire ?
0
oui c'est ca !
pour chaque sujet, le dernier commentaire déposé le (date) par (user)
merci d'avance !
0
Utilisateur anonyme
3 mars 2011 à 09:52
Bon,

En SQL ce genre d'opération est très difficile, du moins ce que j'en connais.

Pour une discussion donnée je sais le faire, considérez ID comme étant l'id_sujet d'un sujet dans la table discussion :

SELECT
d.*, c.id_user AS lastcomuser,
max(c.date_commentaire) AS lastcomdate,
COUNT(c.id_commentaire) AS nbcommentaires
FROM
discussions d
LEFT OUTER JOIN 'commentaires' c ON d.id_sujet=c.id_sujet and d.id_sujet=ID
where
c.id_user = (
SELECT
max(id_user)
FROM
commentaires
WHERE
id_sujet=ID
)
GROUP BY d.id_sujet, c.id_user

Mais il va falloir tout d'abord récupérer tous les id_sujet de discussion et faire une boucle dessus, bof bof.

Donc je ferais ça en deux temps

select * from discussion order by date_discussion desc

boucle sur le tableau resultant, disons $tab

puis pour chaque ligne

select
max(id_user) AS lastcomuser,
max(date_commentaire) AS lastcomdate,
COUNT(id_commentaire) AS nbcommentaires
from commentaires
where
id_sujet=ID_SUJET

et ajouter ce tableau résultat à la ligne de $tab correspondant à l'ID_SUJET traité

Il y a peut-être mieux, mais je ne sais pas faire... désolé.

0
Effectivement, l'insertion d'une requete supplémentaire dans la boucle est la solution de recours que j'ai mis en place temporairement.
Bon ca fonctionne pas trop mal, si ce n'est juste la frustration de ne pas pouvoir faire qu'une seule requete.
L'environnement de production ne concernant qu'une centaine d'utilisateur, je n'aurais certainement pas de problèmes de lourdeur...
Merci quand meme beaucoup
0
Utilisateur anonyme
3 mars 2011 à 10:10
De rien,
C'est ça les contraintes du SQL.
0