Aide mysql sur une requete left outer join
ekael
-
Utilisateur anonyme -
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.
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:
- Aide mysql sur une requete left outer join
- Mysql community server - Télécharger - Bases de données
- Join pdf - Télécharger - PDF
- Left shift clavier ✓ - Forum Windows
- Quel est la touche shift sur le clavier ✓ - Forum Jeux vidéo
- Touche left shift bloquée macbook - Forum MacOS
3 réponses
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
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
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é.
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é.
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
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
merci quand même