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

 MySQL Discussion :

2 informations différentes sur une même table


Sujet :

MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 17
    Points
    17
    Par défaut 2 informations différentes sur une même table
    Bonjour,

    Désolé, l'intitulé de ce sujet n'est pas très explicite mais je n'ai pas trouvé mieux. Mais je vous expliqueour le besoin d'un petit projet je développe un petit forum.

    je tante d'avoir toutes les informations dont j'ai besoin pour l'affichage de la liste des forums en une seule requête. Ce qui me pause problème c'est que j'aimerais connaitre le nombre de message qu'il y a dans un forum, mais aussi tout les infos sur le dernier message posté sur le forum en question et cela en une seule requête

    Voici les tables simplifié

    Forum
    • Id
    • Name


    Message
    • Id
    • Forum_Id
    • Author


    Et voici la requête simplifié que j'ai tenté de faire. Bien entendu ça ne fonctionne pas
    Est ce quelqu'un aurait une idée ?
    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select
    Forum.Name as Name,
    Count(Message.Id) as NbMessage,
    LastMessage.Id as LastMessage_Id,
    LastMessage.Author as LastMessage_Author
    from Forum
    LEFT JOIN Message On Message.Forum_Id=Forum.Id
    LEFT JOIN Message as LastMessage On LastMessage.Id=Max(Message.Id)
     
    GROUP BY Message.Id

  2. #2
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Si tu veux récuperer la liste des forums et que tu fait une jointure externe de message vers forum, tu n'obiendra pas la liste de forum mais de message, avec au passage eventuellement un forum associé.
    Pour résoudre ce problème tu pourrait faire ton group by sur le forum mais je pense qu'il est plus simple de faire une jointure interne, ou bien faire la jointure externe de forum vers message.

    En ce qui concerne le MAX(), il faut pour l'utiliser il me semble obligatoirement avec un SELECT, donc une sous requête.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Ca peut se faire en un seul coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT f.Id,
      (SELECT COUNT(*)
       FROM Message
       WHERE Forum_Id = f.Id) AS nb_message,
    m.Id, m.Author
    FROM Forum f
    LEFT JOIN Message m ON f.Id = m.Forum_Id
    WHERE (
      SELECT count(*)
      FROM Message m2
      WHERE m.Forum_Id = m2.Forum_Id
      AND m.Id < m2.Id
    ) < 1
    La grosse difficulté, c'est que tu as 2 types de fonctions d'agrégation ensemble : le count (pour le nombre de messages par forum) et le max sur plusieurs colonnes pour ne ramener que le dernier message... Et que les 2 ne vont pas ensemble, dans ce cas. En plus, MAX ne permet pas de traiter le cas "le message le plus récent de chaque forum".
    Bref, la requête ci-dessus devrait faire ce que tu demandes, mais plus tu auras de forums et de messages dans les forums, et plus les performances de cette requête seront mauvaises.
    Il vaut parfois mieux faire ça en plusieurs étapes. A toi de juger en fonction de ta volumétrie...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. [MySQL] Plusieurs même requetes sur une même table
    Par bibom dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 27/07/2006, 12h54
  2. [DEB] Sousform et Form sur une même table
    Par ip203 dans le forum IHM
    Réponses: 1
    Dernier message: 08/06/2006, 13h23
  3. Sum différents sur sur une même table ...
    Par Saloucious dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/10/2005, 15h51
  4. Réponses: 2
    Dernier message: 29/09/2004, 09h07
  5. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08

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