IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

[Système forums] Aide sur une requête SQL


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier

    Inscrit en
    Mai 2008
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 72
    Points : 106
    Points
    106
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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

  3. #3
    Membre régulier

    Inscrit en
    Mai 2008
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 72
    Points : 106
    Points
    106
    Par défaut
    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.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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.

  5. #5
    Membre régulier

    Inscrit en
    Mai 2008
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 72
    Points : 106
    Points
    106
    Par défaut
    Merci
    Je verrai en la forme de ma requête alors.
    Sinon, le problème a été résolu, en ajoutant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COALESCE(MAX(horaire_reponse),horaire_post) AS critere_ord

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. demande d'aide sur une requête sql serveur
    Par PHPkoala dans le forum Développement
    Réponses: 8
    Dernier message: 30/09/2009, 15h11
  2. Aide sur une requête SQL Server
    Par Morad ISSOULGHANE dans le forum Développement
    Réponses: 4
    Dernier message: 30/09/2009, 11h58
  3. aide sur une requête sql
    Par sanach dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 27/02/2008, 16h43
  4. aide sur une requête sql
    Par sanach dans le forum Développement
    Réponses: 9
    Dernier message: 17/10/2007, 20h42
  5. aide sur une requête sql
    Par sanach dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 17/10/2007, 20h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo