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 :

ORDER BY, MAX() dans une jointure MySQL


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut ORDER BY, MAX() dans une jointure MySQL
    Bonsoir,

    Je vous expose mon problème en espérant avoir de l'aide,
    j'ai une requête qui affiche mon forum comme suite :
    nombre de sujet,
    titre du dernier sujet,
    auteur du dernier sujet et date du dernier sujet de chaque forum, le souci que je rencontre, c'est que je n'arrive pas a afficher le titre ,la date et l'auteur du dernier sujet j'ai beau mettre MAX() dans la colonne DateSujet mai rien y fait pourtant j'ai lu des article, des poste, et des exemple a ce sujet mai vraiment je n'y arrive pas,
    sa fait 1 semaine que je bloque, alors maintenant je fait appel a vous en espérant que vous pourriez m'aider merci d'avance

    Voici ma requête en question :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT IdForum ,IdSujet, NomCategorie,Rang,IdCategorie,NomForum ,IcFor,COUNT(IdSujet) AS NbSujet, TitreSujet, PseudoMembre ,IdMembre ,date_format(MAX(DateSujet),"%d/%m/%Y a %H:%i") AS dateFR
    FROM                                                                                                                  
        Categorie
            LEFT JOIN Forum  ON IdCategorie=IdForCat
            LEFT JOIN Sujet  ON IdSujFor=IdForum
            LEFT JOIN Membre ON AuteurSujet=IdMembre
    GROUP BY 
        IdForum ');

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 623
    Points : 1 370
    Points
    1 370
    Par défaut
    Et quel est le résultat de cette requête ?

    Si tu veux les infos pour la date la plus récente, alors c'est dans la clause WHERE qu'il faut mettre max(date)...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    salut farid cette requête retourne le titre du sujet le plus ancien avec les date et auteur qui ne correspondent pas,
    j'ai fait ce que tu m a dis pour le max dans le where sa ne change rien j'ai toujours le même souci ; (

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    pour trier les enregistrements en fonction du sujet le plus récent c'est:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORDER BY DateSujet DESC
    à condition que DateSujet soit de type date,datetime,timestamp.

    quand on on effectue un groupement de lignes, les colonnes figurant dans le SELECT(exceptées les fonction d'agrégation) doivent apparaître dans le GROUP BY.S'il y a des colonnes qui ne sont pas concernées par le regroupement tu peux les inclure dans group_concact(col2,col3,'separateur'):
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $sql="
    SELECT IdForum ,COUNT(IdSujet) AS NbSujet ,
    GROUP_CONCAT(IdSujet, NomCategorie,Rang,IdCategorie,NomForum ,IcFor, TitreSujet, PseudoMembre ,IdMembre ,
                            date_format(DateSujet,'%d/%m/%Y a %H:%i') ,'#') AS lignes_groupees
      FROM                                                                                                                  
      Categorie
      LEFT JOIN Forum  ON IdCategorie=IdForCat
      LEFT JOIN Sujet  ON IdSujFor=IdForum
      LEFT JOIN Membre ON AuteurSujet=IdMembre
      GROUP BY IdForum ORDER BY DateSujet DESC;
    ";

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    Merci armel18 pour ta réponse mais rien ne marche chez moi j'ai tout essayer de plus des que je met "…ORDER BY DateSujet DESC"
    sa me suprime des forum pour m'en laisser qu'un seul de chaque catégorie,
    je sais pas dutout quoi modifier dans ma requête pour avoir ce que je veux même les MAX(…) ne change rien alors que dans de nombreux poste c'est ce qu'il utilise

    PS: oui DateSujet est de type datetime

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 623
    Points : 1 370
    Points
    1 370
    Par défaut
    Peux-tu nous montrer ton schéma de base de données ?
    Juste les tables qui interviennent dans la requête.
    Merci.

    Edit: Effectivement, je viens de me rendre compte que j'ai dit une boulette, un max dans la clause where, forcément ça marche pas. Il faut plutôt faire une sous-requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE date = (SELECT max(date) FROM ...)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    salut farid63

    J'ai pas compris, que veux tu dire par shema et les table qui intervienne dans la requête?

    la requête que j'utilise avec les table et les champ qui intervienne je l'ai mis en exemple dans mon premier message ou c'est pas sa que tu me demande?

    pour ce qui est du MAX() dans la close WHERE j'avais déjà corrigé mais sa marche toujours pas même avec une sous requête

    a mon avis il y a une erreur que j'ai faite quelque par que je ne vois pas

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 623
    Points : 1 370
    Points
    1 370
    Par défaut
    Je parlais du schéma de tes tables, pour bien voir les jointures de tes tables entre elles, le MLD pour parler en Merise.
    Étrange que ça ne fonctionne pas avec une sous requête.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    TABLE 1 : Categorie
    1 IdCategorie int(8)
    2 NomCategorie varchar(120)
    3 IcCat varchar(40)


    TABLE 2 : Forum
    1 IdForum int(11)
    2 IdForCat int(11)
    3 NomForum varchar(200)
    4 IcFor


    TABLE 3 : Sujet
    1 IdSujet int(11)
    2 IdSujFor int(11)
    3 TitreSujet varchar(255)
    4 AuteurSujet int(11)
    5 DateSujet datetime
    6 OrdreSujet timestamp

    TABLE 4 : Membre
    1 IdMembre int(11)
    2 PseudoMembre varchar(200)
    3 PassMembre varchar(15)
    4 MailMembre varchar(200)
    5 Rang int(2)


    Voici le shema j'espère que sa t'aidera pour m'aider en tout cas merci

    La sous requête ne fonctionne pas elle me supprime tout pour me retourner qu'une seul

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    s'il vous plait aidez moi la je suis bloquer je ne peu plus avancer...

  11. #11
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    essaies de tester ma requête depuis phpmyadmin( ou n'importe quel interpréteur) et poste le résultat.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    voila ce que sa me retourne sur phpmyadmin :

    IdForum	NbSujet	lignes_groupees
    5	5	8Itoto102Le testeIcImage.jpgtesetsuejtSlim117/06/2...
    2	1	6Administration101Administrateuradministration-ico...
    6	2	5Informteste103Le phh et htmlinformatique-Icon.pn...
    1	0	NULL
    3	0	NULL
    4	0	NULL
    7	0	NULL
    en fait cette requette a l'air de marcher mai tout est grouper dans le champ "lignegrouper" hors moi j'ai des colonnes et j'ai besoin de séparer ce qui se trouve dans la colonne ligne grouper

  13. #13
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 623
    Points : 1 370
    Points
    1 370
    Par défaut
    Citation Envoyé par keusty78 Voir le message
    ...
    Merci, ça peut aider .

    C'est pas ce que tu voulais? La ligne avec le dernier sujet ?
    Dans ton premier message tu dis : "c'est que je n'arrive pas a afficher le titre ,la date et l'auteur du dernier sujet ".

    Du coup j'ai pas compris. Tu veux récupérer quel résultat exactement?

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    c est pas ce que je veux car sa me suprime tout pour laisser qu une ligne
    sa suprime tout même les forum alors que moi je veux que sa
    m affiche les forum et le dernier sujet de chaque forum

    exemple :

    categorie1------------------------dernier sujet------------nb sujet-------date/auteur du sujet

    forum1-------------------------------------toto tot..... 02 par toto
    forum2-------------------------------------test test.... 05 par titi

    categorie2
    forum1-------------------------------------ftggffddd.... 01 par dede
    forum2-------------------------------------hhcvjj cv.... 52 par coco
    forum3-------------------------------------htyuiii..... 04 par lili

  15. #15
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 623
    Points : 1 370
    Points
    1 370
    Par défaut
    Je suis arrivé à la solution.
    Voici la requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select NomCategorie, NomForum, TitreSujet, PseudoMembre, dateDernierSujet from
    (
    select IdSujFor, max(DateSujet) as dateDernierSujet
    from sujet
    group by IdSujFor
    ) as T1
    inner join sujet s on T1.dateDernierSujet = s.DateSujet
    inner join forum f on T1.IdSujFor = f.IdForum
    inner join categorie c on f.IdForCat = c.IdCategorie
    inner join membre m on s.AuteurSujet = m.IdMembre

    Normalement avec cela, tu devrais obtenir ce que tu souhaite.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    C'est gentil Farid63 de t'intéresser a mon problème mai je suis désolé c'est pas encore sa ou du moins sa marche pas tout a fait,

    la sa affiche qu'un seul forum par catégorie mai sa affiche bien le dernier message
    il manque plus que a savoir comment faire afficher les autre forum qui on disparut en tout cas merci pour ce début de piste

  17. #17
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 623
    Points : 1 370
    Points
    1 370
    Par défaut
    Etrange, j'ai bien tous les forums de chaque catégorie qui s'affichent, dans mon exemple, deux forums pour la catégorie réseaux :


    Nom : Capture.JPG
Affichages : 290
Taille : 56,9 Ko

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Points : 55
    Points
    55
    Par défaut
    Re Farid63 excuse moi de ne pas avoir répondu plus tôt j'étais en vacance donc la je reviens vers toi ,
    j'ai bien essayer ton exemple mai rien y fait c'est pas vraiment ce que je veux car sa supprime les forum ou il n'y a pas de messages

  19. #19
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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,

    Passez par une jointure externe : http://sqlpro.developpez.com/cours/s...ntures/#LIII-B

  20. #20
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 623
    Points : 1 370
    Points
    1 370
    Par défaut
    La jointure externe ne suffira pas dans ce cas là.

    J'ai modifié la requête pour obtenir les forums mêmes si il n'y a pas de sujet.


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    SELECT NomCategorie, NomForum, TitreSujet, PseudoMembre, convert(varchar(25), dateDernierSujet, 113) FROM
    (
    SELECT IdSujFor, max(DateSujet) AS dateDernierSujet
    FROM sujet
    GROUP BY IdSujFor
    ) AS T1
    LEFT OUTER JOIN sujet s ON T1.dateDernierSujet = s.DateSujet
    LEFT OUTER JOIN forum f ON T1.IdSujFor = f.IdForum
    LEFT OUTER JOIN categorie c ON f.IdForCat = c.IdCategorie
    LEFT OUTER JOIN membre m ON s.AuteurSujet = m.IdMembre
    UNION
    SELECT NomCategorie, NomForum, 'N/A', 'N/A', 'N/A'
    FROM
    forum f
    LEFT JOIN categorie c ON f.IdForCat = c.IdCategorie
    WHERE f.IdForum NOT IN
    (
    SELECT IdSujFor FROM Sujet
    )

    Je ne sais pas ce que tu utilise comme SGBD (ici SQL Server), mais tu risque de devoir modifier la fonction "convert". Il faut juste que tu trouve la fonction qui te permet de transformer un Datetime en String.
    Par contre tu devrait faire un tour ici : http://www.developpez.net/forums/f37...s/langage-sql/ voir si il est possible de l'améliorer.

Discussions similaires

  1. [MySQL, PostGreSQL] Récupérer les max sur une jointure
    Par genova dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/12/2017, 15h25
  2. Utiliser MAX dans une jointure
    Par gotcha5832 dans le forum Requêtes
    Réponses: 3
    Dernier message: 15/07/2014, 01h00
  3. [MySQL] Chercher le contenu d'un tableau dans une table MySQL et jointure
    Par javagirl08 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 19/08/2009, 13h40
  4. trouver une un MAX dans une jointure
    Par cmako dans le forum Langage SQL
    Réponses: 12
    Dernier message: 05/02/2009, 20h34
  5. Réponses: 6
    Dernier message: 23/01/2007, 10h17

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