Aide mysql sur une requete left outer join

ekael -  
 Utilisateur anonyme -
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.

A voir également:

3 réponses

Utilisateur anonyme
 
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
ekael
 
ca marche pour la date mais pas pour l'id_user :(
merci quand même
0
Utilisateur anonyme
 
Bonjour,

Quel id_user voulez vous afficher ?
Le dernier user ayant posté un commentaire ?
0
ekael
 
oui c'est ca !
pour chaque sujet, le dernier commentaire déposé le (date) par (user)
merci d'avance !
0
Utilisateur anonyme
 
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
ekael
 
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
 
De rien,
C'est ça les contraintes du SQL.
0