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 :

Aide pour une requête compliquée


Sujet :

Langage SQL

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 21
    Points : 11
    Points
    11
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    id       code1       code2       code3
    1        200         250          400
    Table Sessions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT `dateDebut`  FROM `sessions` ORDER BY `dateDebut`
    - Pour insérer dans la table Stages toutes les sessions du 22/05/2011
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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).

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    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

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    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 :
    - Quel résultat souhaites-tu obtenir ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    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

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Le codeStage dans la table sessions est-il unique ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    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.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    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.

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

Discussions similaires

  1. Aide pour une requête compliquée
    Par miniil dans le forum Langage SQL
    Réponses: 7
    Dernier message: 27/02/2014, 17h55
  2. Besoin d'aide pour une requète compliquée
    Par Tonii dans le forum SQL
    Réponses: 13
    Dernier message: 27/11/2009, 15h41
  3. Besoin d'aide pour une requête compliquée
    Par Chekov dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/01/2008, 11h59
  4. Réponses: 2
    Dernier message: 12/09/2007, 22h47
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 16h38

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