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 22/05/2011, 20h46   #1
Invité de passage
 
Inscription : janvier 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 21
Points : 4
Points : 4
Par défaut Aide pour une requête compliquée

Bonjour à tous,

Je viens solliciter de l'aide pour une requête que j'ai du mal à faire (je ne sais même pas si elle est possible...)

Je tiens à préciser que le schéma de données n'est pas modifiable (et c'est lui qui pose problème), car je ne suis pas maître sur ce dernier, je dois faire avec.

J'ai donc le schéma suivant :

- une table Stages, qui comprend un identifiant unique en clé primaire, et 3 autres identifiants de stage (vous allez voir pourquoi après).

- une table Sessions, qui sont des occurences de stages, qui comprend un identifiant de session, un code stage (qui n'est pas le code unique que je ne peux pas récupérer ici, mais un des 3 autres identifiants de la table Stages), une date de début, une date de fin.

Le problème c'est que les données viennent de plusieurs endroits ce qui fait qu'il peut y avoir 2 sessions avec 2 codes de stage différents, mais si la date est la même, ça veut dire que c'est en fait la même session. Si la date n'est pas la même, ce sont des sessions différentes.

D'où la table Stages avec l'identifiant unique qui regroupe les 3 autres pour essayer de faire le lien entre ces sessions qui sont les mêmes.

La question est maintenant de savoir comment faire une requête SQL avec tout ça pour au final éviter de voir plusieurs sessions différentes là où en fait, ce sont les mêmes...

Un exemple de données :

Table Stages
Code :
1
2
3
 
id       code1       code2       code3
1        200         250          400
Table Sessions
Code :
1
2
3
4
5
6
 
id      codeStage         dateDebut         dateFin
1          200            22/05/2011     23/05/2011
2          250            22/05/2011     23/05/2011
3          400            22/05/2011     23/05/2011
4          400            25/05/2011     27/02/2011
Les sessions 1, 2 et 3 sont en fait la même, la 4 est différente...

Merci si vous avez une idée
DiPSoMaNiE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 01h13   #2
Membre confirmé
 
Homme
Développeur informatique
Inscription : avril 2011
Messages : 196
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Italie

Informations professionnelles :
Activité : Développeur informatique
Secteur : Transports

Informations forums :
Inscription : avril 2011
Messages : 196
Points : 298
Points : 298
De selon j'ai compris de ta question, je te donne quelques idées.
Table Stages :
- Pour avoir code1 (1er de la liste) du 22/05/2011
Code :
SELECT codeStage FROM `sessions` WHERE `dateDebut`='2011-05-22' ORDER BY `codeStage` ASC LIMIT 0,1
- Pour avoir code2 (2eme de la liste) du 22/05/2011
Code :
SELECT codeStage FROM `sessions` WHERE `dateDebut`='2011-05-22' ORDER BY `codeStage` ASC LIMIT 1,1
- Pour avoir code3 (3eme de la liste) du 22/05/2011
Code :
SELECT codeStage FROM `sessions` WHERE `dateDebut`='2011-05-22' ORDER BY `codeStage` ASC LIMIT 2,1
- Pour avoir la liste des dates des sessions sans répétition
Code :
SELECT DISTINCT `dateDebut`  FROM `sessions` ORDER BY `dateDebut`
- Pour insérer dans la table Stages toutes les sessions du 22/05/2011
Code :
1
2
3
4
5
6
7
INSERT INTO Stages (id,code1,code2,code3) VALUES 
(
NULL, 
(SELECT codeStage FROM `sessions` WHERE `dateDebut`='2011-05-22' ORDER BY `codeStage` ASC LIMIT 0,1),
(SELECT codeStage FROM `sessions` WHERE `dateDebut`='2011-05-22' ORDER BY `codeStage` ASC LIMIT 1,1),
(SELECT codeStage FROM `sessions` WHERE `dateDebut`='2011-05-22' ORDER BY `codeStage` ASC LIMIT 2,1)
)
En supposant que id est un AUTOINCREMENT et que code1,code2,code3 accepte NULL comme valeur (dans le cas ou y'a 0/1/2 sessions).
fab256 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 08h50   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 001
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 001
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
La base de données est effectivement très mal foutue ! Tu engueuleras le concepteur de ma part !

Avec ton explication et l'exemple de données que tu donnes, on suppose que si deux sessions ont les mêmes dates, cela implique qu'il s'agit du même stage. Est-ce que la réciproque est vraie ? Il ne peut pas y avoir deux stages différents aux mêmes dates ?
J'espère que oui sinon je pense que tu ne pourras sortir la liste des stages sans redondance.

Questions complémentaires :
- Quel est ton SGBD ?
- Quel résultat souhaites-tu obtenir ?
- Les code1, code2, code3 dans la table stage sont-ils toujours classés en ordre croissant ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 09h06   #4
Invité de passage
 
Inscription : janvier 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 21
Points : 4
Points : 4
Citation:
Envoyé par fab256 Voir le message
De selon j'ai compris de ta question, je te donne quelques idées.
(...)
En supposant que id est un AUTOINCREMENT et que code1,code2,code3 accepte NULL comme valeur (dans le cas ou y'a 0/1/2 sessions).
Désolé mais je n'ai pas très bien compris ton raisonnement. Il faut que cela se fasse sur un très grand nombre de données et non sur 3 sessions donc je ne comprends pas vraiment les limites.

De plus le DISTINCT dateDebut ne peut s'appliquer car je peux avoir 2 sessions à la même date mais venant de 2 stages différents (c'est à dire qu'on ne retrouve pas les 2 codes de stage sous le même id dans un tuple de la table Stages).

Citation:
Envoyé par CinePhil Voir le message
La base de données est effectivement très mal foutue ! Tu engueuleras le concepteur de ma part !

Avec ton explication et l'exemple de données que tu donnes, on suppose que si deux sessions ont les mêmes dates, cela implique qu'il s'agit du même stage. Est-ce que la réciproque est vraie ? Il ne peut pas y avoir deux stages différents aux mêmes dates ?
J'espère que oui sinon je pense que tu ne pourras sortir la liste des stages sans redondance.

Questions complémentaires :
- Quel est ton SGBD ?
- Quel résultat souhaites-tu obtenir ?
- Les code1, code2, code3 dans la table stage sont-ils toujours classés en ordre croissant ?
En fait les données sont extraites en fichiers plats depuis différents logiciels, le même mais dans plusieurs endroits ce qui fait que les codes de stages diffèrent alors que les sessions sont communes à ces différents endroits... Oui c'est très mal foutu

Il peut y avoir plusieurs sessions différentes à la même date, à condition que leurs codes stages ne soit pas regroupés sous le même id dans la table Stages. Tu me suis toujours ? :-D

Par contre il ne peut pas y avoir 2 sessions différentes avec des dates équivalentes (début et fin) dont les codes stages se retrouvent dans une même ligne de la table Stages. Or, c'est ce que j'ai pour le moment, je cherche donc à "fusionner" celles-ci dans ma requête car ce sont en fait les mêmes ("fusionner" = n'en avoir qu'une dans mes résultats, la première par exemple et ignorer les autres, je pourrai retrouver le code stage de celles ignorées à partir du code stage de celle que j'ai en faisant une jointure sur Stage où les dates sont égales)

Les code1, code2 et code3 ne sont pas croissants ils sont aléatoires et je prie pour que l'on ne retrouve jamais les mêmes entre les différentes colonnes (autrement dit tout ce qui est dans la colonne code1 ne se retrouvera jamais dans la code2) sinon ça va être un gros problème.

Et pour finir, mon SGBD est SQL Server 2005
DiPSoMaNiE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 09h29   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 001
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 001
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
D'après ce que je comprends de ta dernière réponse, tu peux donc avoir deux stages réellement différents aux mêmes dates ?
Par exemple ceci :
id / code1 / code2 / code3 / dateDebut / dateFin
12 / 100 / 200 / 300 / 2011-05-10 / 2011-05-15
20 / 150 / 250 / 350 / 2011-05-10 / 2011-05-15

Si c'est le cas, et dans la mesure où les code1, code2 et code3 sont sur des lignes différentes dans la table sessions, quelle autre information te permet de savoir sir les codes 100, 200 et 300 correspondent à des sessions du même stage ou non ?

Et bis repetita :
Citation:
- Quel résultat souhaites-tu obtenir ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 09h42   #6
Invité de passage
 
Inscription : janvier 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 21
Points : 4
Points : 4
Oui ce cas de figure est tout à fait possible. Pour savoir si des sessions correspondent au même stage, je n'ai pas d'autre moyen que de faire le lien entre ces sessions via leur code stage.

Par exemple les sessions :

id / codeStage / dateD / dateF
1 / 100 / 2011-05-10 / 2011-05-15
2 / 200 / 2011-05-10 / 2011-05-15
3 / 300 / 2011-05-16 / 2011-05-18
4 / 150 / 2011-05-10 / 2011-05-15
5 / 250 / 2011-05-16 / 2011-05-18

Dans ce cas de figure, les sessions 1 et 2 sont en fait la même, mais la session 3 est différente. La sessions 4 n'a rien à voir avec 1 et 2 même si elle a les mêmes dates, puisque son code stage n'est pas sur la même ligne dans la table Stages. De même pour la session 5, totalement différente de la 3.

Ce que je cherche donc à sortir de ma base serait ceci :

id / codeStage / dateD / dateF
1 / 100 / 2011-05-10 / 2011-05-15
3 / 300 / 2011-05-16 / 2011-05-18
4 / 150 / 2011-05-10 / 2011-05-15
5 / 250 / 2011-05-16 / 2011-05-18

C'est à dire que je cherche à détecter les sessions qui sont en réalité les mêmes pour ne pas les avoir en double dans mon résultat de sortie, sachant que 2 sessions sont les mêmes si :
- leurs codes stages se retrouvent dans une même ligne de la table Stages
- leurs dates sont égales
DiPSoMaNiE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 10h04   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 001
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 001
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Le codeStage dans la table sessions est-il unique ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 10h08   #8
Invité de passage
 
Inscription : janvier 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 21
Points : 4
Points : 4
Unique à quel niveau ?

Il est redondant dans la table sessions car il peut y avoir plusieurs sessions d'un même stage à des dates différentes (mais c'est toujours le même stage), donc il y aura 2 sessions avec 2 id primaires différents, 2 dates différentes, mais un code stage égal.
DiPSoMaNiE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h31   #9
Invité de passage
 
Inscription : janvier 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 21
Points : 4
Points : 4
Finalement résolu...

Le schéma n'était tellement pas viable que j'ai développé un prétraitement des données avant de les récupérer pour les séparer comme il faut.
DiPSoMaNiE 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 14h58.


 
 
 
 
Partenaires

Hébergement Web