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

Langage SQL Discussion :

Sélection sur une seule table mais avec des critères spéciaux


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Sélection sur une seule table mais avec des critères spéciaux
    Bonjour,
    Je flanche un peu sur l'élaboration d'une requête qui me semblait simple car sur une seule table, mais en fait je bloque complètement et j'espère que vous pourrez m'aider.

    Voici la table en question :

    Table Message :
    MsgId (PK) | MsgObjet | MsgText | MsgReplyTo


    Lorsque l'on répond à un message on met l'Id du message source dans la colonne ReplyTo, donc si c'est le premier message de la discussion, MsgReplyTo sera null.

    Par exemple on aurait les message suivants ou 2 est la réponse à 1 :

    MsgId (PK) | MsgObjet | MsgText | MsgReplyTo
    1 | Bonjour | Corps du Message | Null
    2 | Bonjour réponse | Corps de la réponse | 1


    Ce que j'essaie d'avoir en une requête, c'est d’avoir toutes les informations du message 1 plus une colonne booléen ou autre qui m'indique s'il y a une réponse présente dans la bdd (en l’occurrence il y en a une).

    Je suis un peu perdu, je ne sais pas si je peux passer par un left join ou si je doit utiliser des requêtes imbriquées?

    L'autre solution serait de faire une requête pour chaque messages afin de vérifier si le nombre de réponses est supérieur à 0.
    Merci d'avance pour votre aide!

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      select Mt1.MsgId, Mt1.MsgObjet
           , Mt1.MsgText, Mt1.MsgReplyTo
           , count(Mt2.MsgId) as NbReponses
        from MaTable as Mt1
             left outer join MaTable as Mt2
               on Mt2.MsgReplyTo = Mt1.MsgId
       where Mt1.MsgId = 1
    group by Mt1.MsgId, Mt1.MsgObjet
           , Mt1.MsgText, Mt1.MsgReplyTo
    Au lieu de définir un booléen, j'indique le nombre de réponses directes, ça pourrait être plus utile.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    as tu pensé aux auto-jointures ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ....
    FROM Message AS Recu
        LEFT JOIN Massage AS Reponse ON (Recu.MsgId = Reponse.MsgReplyTo)
    .....
    J'ai mis un LEFT JOIN pour visualiser les messages sans réponse. Une solution alternative serait (à définir selon l'optimisation):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT ....
    FROM Message AS Recu
        INNER JOIN Massage AS Reponse ON (Recu.MsgId = Reponse.MsgReplyTo)
    .....
    UNION
    SELECT ....
    FROM Message AS Recu
        WHERE NOT EXISTS(SELECT 1 
                                          FROM Message 
                                          WHERE Message.MsgReplyTo = Recu.MsgId ) 
    .....
    ou un truc approchant
    Merci d'ajouter un sur les tags qui vous ont aidé

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      select Mt1.MsgId, Mt1.MsgObjet
           , Mt1.MsgText, Mt1.MsgReplyTo
           , count(Mt2.MsgId) as NbReponses
        from MaTable as Mt1
             left outer join MaTable as Mt2
               on Mt2.MsgReplyTo = Mt1.MsgId
       where Mt1.MsgId = 1
    group by Mt1.MsgId, Mt1.MsgObjet
           , Mt1.MsgText, Mt1.MsgReplyTo
    Au lieu de définir un booléen, j'indique le nombre de réponses directes, ça pourrait être plus utile.
    La réponse de Waldar me convient parfaitement car je vois bien tous les messages y compris ceux qui n'ont pas de réponse.

    Merci à vous deux!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/09/2012, 09h52
  2. Merge sur une seule table
    Par dingoth dans le forum Oracle
    Réponses: 2
    Dernier message: 09/01/2007, 10h09
  3. plusieurs COUNT sur une seule table avec conditions différentes
    Par dingoth dans le forum Administration
    Réponses: 9
    Dernier message: 20/12/2006, 10h13
  4. [Oracle]commande MERGE sur une seule table
    Par DoRiane dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/08/2006, 17h13
  5. [SQL serveur] [debutant] requette sur une seule table
    Par glanumf dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2006, 15h27

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