|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : janvier 2009 Messages : 21 ![]() |
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 :
Code :
Merci si vous avez une idée |
||||
|
|
00
|
|
|
#2 | ||
|
Membre confirmé
![]() Développeur informatique Inscription : avril 2011 Messages : 196 ![]() |
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 Code :
SELECT codeStage FROM `sessions` WHERE `dateDebut`='2011-05-22' ORDER BY `codeStage` ASC LIMIT 1,1 Code :
SELECT codeStage FROM `sessions` WHERE `dateDebut`='2011-05-22' ORDER BY `codeStage` ASC LIMIT 2,1 Code :
SELECT DISTINCT `dateDebut` FROM `sessions` ORDER BY `dateDebut` Code :
|
||
|
|
00
|
|
|
#3 |
![]() ![]() |
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 ! |
|
00
|
|
|
#4 | ||
|
Invité de passage
![]() Inscription : janvier 2009 Messages : 21 ![]() |
Citation:
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:
![]() 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 |
||
|
|
00
|
|
|
#5 | |
![]() ![]() |
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:
__________________
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 ! |
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : janvier 2009 Messages : 21 ![]() |
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 |
|
|
00
|
|
|
#7 |
![]() ![]() |
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 ! |
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : janvier 2009 Messages : 21 ![]() |
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. |
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : janvier 2009 Messages : 21 ![]() |
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. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com