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.

3 réponses

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

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