Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 11/07/2011, 10h46   #1
Invité de passage
 
Homme
Inscription : juillet 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 3
Points : 0
Points : 0
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!
kraxdaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 11h05   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Quelque chose comme ceci :
Code :
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.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/07/2011, 11h12   #3
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
as tu pensé aux auto-jointures ?

Code :
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 :
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 11h29   #4
Invité de passage
 
Homme
Inscription : juillet 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 3
Points : 0
Points : 0
Citation:
Envoyé par Waldar Voir le message
Quelque chose comme ceci :
Code :
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!
kraxdaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h44.


 
 
 
 
Partenaires

Hébergement Web