Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/12/2011, 15h04   #1
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 66
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 66
Points : 36
Points : 36
Par défaut [Système forums] Aide sur une requête SQL

Bonjour;
Je suis penché sur la création d'un système forums et j'ai pas mal de soucis pour l'instant côté SQL.
J'essaie de faire la requête suivante :
" Ordonner les sujets d'un forum selon leur type, puis la date de la dernière réaction sur un sujet et enfin la date de la création d'un sujet ".
Comme solution primaire, j'ai élaboré la requête SQL suivante :
Code :
1
2
3
4
5
SELECT Post.id_post, titre_post, resolu_post, slug_post, aff_post, etat_post, type_post, horaire_post, Post.id_user, pseudo, type, MAX(id_reponse) AS der_reponse, MAX(horaire_reponse) AS hr_der_reponse, COUNT(id_reponse) AS nbr_reponses 
FROM posts AS Post NATURAL JOIN users  LEFT JOIN reponses  ON reponses.id_post=Post.id_post  
WHERE id_forum=2 
GROUP BY Post.id_post  
ORDER BY type_post  DESC ,  hr_der_reponse DESC ,horaire_post DESC LIMIT 0,10
Il se voit que ce que je fais dans cette dernière c'est une jointure de trois table qui sont :
1- posts
2- users
3- reponses

Détails:

- type_post (integer) : représente le type du post ==> critère d'ordonnancement : du plus grand vers le plus petit.
- hr_der_reponse et horaire_post (integer /*timestamp*/) ===>critère d'ordonnancement : de la date la plus récente vers la plus ancienne.

Problèmatique:

Pour tout les cas possibles cette requête semblait bien marcher sauf pour le cas où j'ai un post où aucune réponse y figure ! ===> il se place tout à la fin de ma liste que qu'en fait il devait se plaçait là où il doit suivant sont type d'abord puis sa date de création seulement.
Bon c'est logique puisque, le post n'a aucune réponse donc y a pas de "hr_der_reponse" qui représente la date de la dernière réaction dans sur ce post.

Question(s):
Y'aurait-il une astuce pour éviter ça en SQL?
Merci en avance pour votre aide
crazy_inf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2011, 16h00   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 653
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 653
Points : 2 655
Points : 2 655
Bonjour,

la structure de votre requête est a revoir.
En effet vous utilisez un group by mais vous avez les 3/4 des colonnes du select qui ne sont :
- ni dans la clause group by
- ni encadré d'une fonction d'agrégation

Pour en revenir à votre problème, vous pourriez utiliser COALESCE dans le select afin d'avoir horaire_post quand hr_der_reponse est null
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2011, 16h21   #3
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 66
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 66
Points : 36
Points : 36
D'abord merci pour votre réponse.

Citation:
Envoyé par punkoff Voir le message
la structure de votre requête est a revoir.
En effet vous utilisez un group by mais vous avez les 3/4 des colonnes du select qui ne sont :
- ni dans la clause group by
- ni encadré d'une fonction d'agrégation
Est-ce une obligation qu'elles doivent y figurer dans la clause group by ou être encadrées par une fonction d'agrégation?
Parce-que je voyais que le group by id_post suffisait et que je devais récupérer les colonnes via php.
Citation:
Envoyé par punkoff Voir le message
Pour en revenir à votre problème, vous pourriez utiliser COALESCE dans le select afin d'avoir horaire_post quand hr_der_reponse est null
Je dois d'abord voir ce que c'est puis, je vous fournirai le résultat.
crazy_inf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2011, 17h29   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 653
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 653
Points : 2 655
Points : 2 655
Citation:
Envoyé par crazy_inf Voir le message
Est-ce une obligation qu'elles doivent y figurer dans la clause group by ou être encadrées par une fonction d'agrégation?
Parce-que je voyais que le group by id_post suffisait et que je devais récupérer les colonnes via php.
D'un point de vu norme oui ca l'est (obligatoire).

Dans le cas présent vous ne maitrisez pas les valeurs des colonnes qui ne sont ni dans le group by, ni encadré par une fonction d'agrégation.

La vous ne voyez pas de problème car il n'y a qu'une ligne par post_id, mais vous risquez d'avoir des surprises avec d'autre cas.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2011, 18h27   #5
Nouveau Membre du Club
 
Inscription : mai 2008
Messages : 66
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 66
Points : 36
Points : 36
Merci
Je verrai en la forme de ma requête alors.
Sinon, le problème a été résolu, en ajoutant ça :
Code :
COALESCE(MAX(horaire_reponse),horaire_post) AS critere_ord
crazy_inf est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h13.


 
 
 
 
Partenaires

Hébergement Web