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

Requêtes MySQL Discussion :

Insertion de données en fonction de données d'une autre table


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 30
    Par défaut Insertion de données en fonction de données d'une autre table
    Bonjour à tous,
    J’ai besoin d’aide pour une requête SQL
    J’ai une table acd_cours_instance qui est une instance de chaque cours. En effet, un cours a lieu dans un semestre donné (semestre), une année donnée (annee) et un programme particulier(idprogramme : cours en semaine/cours du samedi … référence à une autre table)
    Nom : acd_cours_instance.png
Affichages : 472
Taille : 21,1 Ko

    La table acd_etud_cours donne toutes les instances de cours suivies par tous les étudiants
    Nom : acd_etud_cours-modif.png
Affichages : 454
Taille : 24,6 Ko

    Ce sont deux tables qui existent déjà !

    La table acd_situation_etudiant est une table que je viens de créer (si elle n'est pas bien faite, c'est donc possible de la changer !). L’objectif est en effet d’arriver à créer un PDF pour visualiser la situation de l’étudiant aux regards des diplômes (Par exemple pour savoir pour diplôme d’un an, quels cours a-t-il validé / combien de crédits a-t-il/combien lui restes-t-il de crédit à valider dans quelle matière etc.)
    Nom : acd_sitation_etudiant.png
Affichages : 444
Taille : 36,2 Ko

    Ce n’est qu’un aperçu de la table. Pour valider le diplôme d’un an, il faut entre autre faire deux STH (stages hebdomadaires)

    J’aimerais créer une requête qui me permette de remplir idSituationEtudiant dans la table acd_etud_cours de manière adéquate
    Je pense à cela comme requête select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `acd_etud_cours` INNER JOIN acd_cours_instance ON `acd_etud_cours`.`idCoursInstance`= `acd_cours_instance`.`idCoursInstance` INNER JOIN acd_situation_etudiant ON acd_cours_instance.idCours=acd_situation_etudiant.idCours
    Mais que faire comme requête insert ???
    Voilà ce qu’il faudrait que j’insère (en jaune)
    Nom : acd_requete_select-modif.png
Affichages : 443
Taille : 35,1 Ko

    Explication : le premier STH (stage hebdo) (idEtudCours=1) correspond à l’idSituationEtudiant 1 : c’est le premier STH obligatoire du premier cycle
    le deuxième STH (stage hebdo) (idEtudCours=2) correspond à l’idSituationEtudiant 2 : c’est le deuxième STH obligatoire du premier cycle
    le troisième STH (stage hebdo) (idEtudCours=3) correspond à l’idSituationEtudiant 5 : c’est le premier STH obligatoire du deuxième cycle
    le quatrième STH (stage hebdo) (idEtudCours=4) correspond à l’idSituationEtudiant 6 : c’est le deuxième STH obligatoire du deuxième cycle (ce cours n’a pas été validé, donc ça ne devrait correspondre à aucun idSituationEtudiant, mais ça c’est l’étape suivante)
    Le premier STS (stage à temps plein) (idEtudCours =5) correspond à l’idSituationEtudiant 3, c’est le premier STS obligatoire du premier cycle

    Et ça, c’est donc la table acd_etud_cours que j’aimerais bien remplir avec ces données-là
    Nom : resultatvoulu-modif.png
Affichages : 430
Taille : 62,6 Ko

    Mais comment faire cela de manière automatique ?
    Merci d'avoir lu jusque là et merci d'avance pour tout aide
    Anne
    Images attachées Images attachées    

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 963
    Par défaut
    Pas lu le détail, juste le titre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert into ... select ...
    ne convient pas ?

  3. #3
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 917
    Par défaut
    Salut à tous.

    Citation Envoyé par Michel.Priori
    Pas lu le détail, juste le titre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert into ... select ...
    ne convient pas ?
    Je n'appelle pas cela une analyse pertinente. Vous n'expliquez pas pourquoi cette solution ne peut pas convenir.

    Citation Envoyé par anouka
    J’aimerais créer une requête qui me permette de remplir idSituationEtudiant dans la table acd_etud_cours de manière adéquate
    Il s'agit de remplir la colonne "idSituationEtudiant" de la table "acd_etud_cours" à partir de la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT      *
          FROM  `acd_etud_cours`     as t1
     
    INNER JOIN  `acd_cours_instance` as t2
            ON  t2.`idCoursInstance`= t1.`idCoursInstance` 
     
    INNER JOIN  `acd_situation_etudiant` as t3
            ON  t3.idCours = t2.idCours;
    qui n'est pas terminée.
    Dans votre exemple, vous indiquez en jaune deux colonnes qui sont : "IdEtudCours" et "IdSituationEtudiant" qui doivent être impactées par votre mise_a_jour.
    Jusque là, ça va.

    C'est après que tout se complique.
    Citation Envoyé par anouka
    Explication :
    le premier STH (stage hebdo) (idEtudCours=1) correspond à l’idSituationEtudiant 1 : c’est le premier STH obligatoire du premier cycle
    le deuxième STH (stage hebdo) (idEtudCours=2) correspond à l’idSituationEtudiant 2 : c’est le deuxième STH obligatoire du premier cycle
    le troisième STH (stage hebdo) (idEtudCours=3) correspond à l’idSituationEtudiant 5 : c’est le premier STH obligatoire du deuxième cycle
    le quatrième STH (stage hebdo) (idEtudCours=4) correspond à l’idSituationEtudiant 6 : c’est le deuxième STH obligatoire du deuxième cycle
    (ce cours n’a pas été validé, donc ça ne devrait correspondre à aucun idSituationEtudiant, mais ça c’est l’étape suivante)

    Le premier STS (stage à temps plein) (idEtudCours=5) correspond à l’idSituationEtudiant 3, c’est le premier STS obligatoire du premier cycle

    Et ça, c’est donc la table acd_etud_cours que j’aimerais bien remplir avec ces données-là
    Je ne comprends pas la relation qui existe entre "idSituationEtudiant" avec les valeurs 1,2,5,6,3 et le reste.
    D'où sortez-vous ces chiffres ? A quoi cela correspond ?

    Je suppose que la table "acd_etud_cours" (l'image où vous soulignez en jaune) est un exemple correcte de ce que vous désirez obtenir.
    Pour l'étudiant 755, il y a un total de 18 lignes, avec une distinction entre le premier cycle (10 lignes) et le second cycle (8 lignes).
    Pour le cycle 1 et pour IdCoursInstances je remarque que les valeurs vont de 1, 2, 3, 4 à 5. Et cela deux fois.
    Pour le cycle 2 et pour IdCoursInstances je remarque que les valeurs vont de 1, 2, 3 à 4. Et cela deux fois.
    Pourquoi vous répétez deux fois ces groupes ?

    Je ne comprends pas, non plus, comment vous faites pour attribuer que les lignes notés en jaune.
    Dans votre exemple, il manque un critère de remplissage.
    Si IdEtudCours = 1 pourquoi remplir que la ligne 1 et pas aussi la ligne 5, 11 et 15 ?
    Si IdEtudCours = 2 pourquoi remplir que la ligne 6 et pas aussi la ligne 2, 12 et 16 ?
    Si IdEtudCours = 5 pourquoi remplir que la ligne 9 et pas aussi la ligne 10 ?
    Si IdEtudCours = 3 pourquoi remplir que la ligne 13 et pas aussi la ligne 3, 7 et 17 ?
    Si IdEtudCours = 4 pourquoi remplir que la ligne 18 et pas aussi la ligne 4, 8 et 14 ?

    Mon idée était de partir sur ce genre de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    update `acd_etud_cours`
       set `IdSituationEtudiant` = case IdEtudCours when 1 then 1
                                                    when 2 then 2
                                                    when 3 then 5
                                                    when 4 then 6
                                                    when 5 then 3
                                                           else NULL end case
     where IdEtudiant = 755;
    Pour poursuivre, il me manque des informations afin d'affiner la requête que vous cherchez à faire.

    @+

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 30
    Par défaut
    Bonjour à tous,
    Merci pour les deux réponses et d'avoir pris le temps de lire ce message et d'essayer de comprendre.
    @Michel.Prior : J'ai donné un exemple pour la table acd_etud_cours, mais il faut savoir qu'elle comprend plus de 17000 enregistrements.
    C'est pour ça que je ne peux pas faire une insertion "simple", il faut que je réfléchisse aux relations entre les deux tables et à comment insérer ce que je veux au bon endroit.

    Citation Envoyé par Artemus24 Voir le message
    Je ne comprends pas la relation qui existe entre "idSituationEtudiant" avec les valeurs 1,2,5,6,3 et le reste.
    D'où sortez-vous ces chiffres ? A quoi cela correspond ?
    Bonnes questions ! En fait, je dois plus réfléchir à la conception de ma troisième base de données (ou réfléchir autrement) pour que la relation soit plus claire entre ces deux tables et me permette de faire l'insertion rapidement ... Cette discussion m'a fait prendre conscience de cela !

    Et alors, c'est mieux de mettre cette discussion en pause, à moi de réfléchir davantage pour le moment.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 30
    Par défaut
    Bonjour à tous,
    J'espère que ma demande sera plus claire maintenant.
    J'ai une table acd_situation_etudiant
    Nom : acd_sitation_etudiant.png
Affichages : 405
Taille : 36,2 Ko

    J'ai une table acd_etud_cours trié selon EtudCoursId :
    Nom : tbl-EtudCours.PNG
Affichages : 446
Taille : 58,6 Ko
    Je souhaite rajouter à cette table une colonne idSituationEtudiant comprenant les données adéquates de la table acd_situation_etudiant

    Dans ce cas, j'aurais besoin d'une requête qui regarde où acd_situation_etudiant.idCours=acd_etud_cours.CoursInstanceId et s'il y a plusieurs enregistrements qui correspondent à cela ; qui prend le premier enregistrement (tri selon EtudCoursId) avec la première valeur idSituationEtudiant ; le deuxième enregistrement avec la deuxième valeur idSituationEtudiant.

    Donc dans la table acd_etud_cours ; par exemple, pour EtudCoursId = 17331, on aurait idSituationEtudiant = 1
    et aussi pour EtudCoursId = 17995, on aurait idSituationEtudiant = 2
    Est-ce qu'une requête permet de faire cela ?

  6. #6
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 963
    Par défaut
    Peux tu faire un diagramme avec "Mysql workbench" ?

    Ca donne des trucs dans le genre :
    Nom : MySQL_Workbench_Visual_Design_Mac.png
Affichages : 363
Taille : 300,4 Ko

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 30
    Par défaut
    Et voilà (migration d'access à MySql, les noms ne sont pas tout-à-fait les mêmes que dans mes captures d'écran précédentes ; acd_etudCours est une ancienne table auquelle j'ai rajouté idSituationEtudiant et acd_situationEtudiant est une nouvelle table)
    Nom : mySqlWorkbench.PNG
Affichages : 392
Taille : 85,9 Ko

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 636
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Quelques remarques :

    Situation_etudiant :
    - habituellement une situation c'est à date, or ici on ne voit pas de date, c'est suspect...
    - l'attribut idCours n'est pas marqué comme FK, est-ce normal ? (auquel cas un autre nom que id... serait préférable)

    coursEtud :
    - idcoursinstance n'est pas marqué comme FK, est-ce normal ?
    - coteFinale est de type varchar, s'il s'agit d'une cote (au sens résultat d'une cotation) alors il faut un type decimal, sinon, il faut choisir un nom plus approprié
    - ECTSValide est de type decimal, s'il s'agit d'un indicateur de validité, un booléen est préférable


    Edit : après avoir relu le 1er post, je vois que cours_instance est décrit comme "une instance de chaque cours", pourtant il n'y a que l'année et le semestre comme attribut d'horodatage.
    Donc ça signifie qu'un cours est donné au plus une seule fois par semestre

    Par ailleurs, sur le fond, cette phrase m'avait échappé :

    Citation Envoyé par anouka Voir le message
    Je souhaite rajouter à cette table une colonne idSituationEtudiant comprenant les données adéquates de la table acd_situation_etudiant
    pourquoi vouloir créer une redondance en ajoutant dans une table un attribut que vous avez déjà dans une autre table
    Le principe d'un SGBD-R est justement de ne pas faire de redondance et de ne mettre dans une table que des attributs en dépendance fonctionnelle stricte de ses identifiants
    Donc ne dupliquez pas l'attribut, créez vous une requête ou une vue qui satisfasse vos besoin par jointure sur les tables nécessaires

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 30
    Par défaut
    Bonjour escartefigue,
    Merci pour les diverses corrections ; varchar(45) ça doit être la valeur par défaut de mySqlWorkbench c'est effectivement une erreur ; cote (belgicisme) correspond bien à une note en tout cas.
    Et les diverses id sont bien des clés étrangères
    Effectivement une instance d'un cours (série de cours) ne peut pas être donnée plus qu'une fois par semestre. L'enjeu n'est pas de sauvegarder en mémoire le nombre de fois pendant le semestre (tous les mardis de 10h à 12h par exemple) que le prof a donné le cours X ; ce n'est pas une donnée qui figure dans la base de données.

    Quand je dis "situation Etudiant", je veux dire situation de l'Etudiant au regard des diplômes. Combien a-t-il déjà validé de crédit pour le diplôme d'un an ? et combien lui en reste-t-il ? Pareil pour le diplôme de deux ans ; sachant qu'il y a des subtilités : un cours en option pour le diplôme d'un an peut être obligatoire pour le diplôme de deux ans : pour le "cours" "stage" il doit en avoir validé deux pour la première année ; deux pour la seconde ...

    Pour info, voilà le document que je voudrais pouvoir avoir (l'exemple n'est pas le même que les données dans les bases de données actuelles par contre désolée)
    Nom : situationEtudiant.PNG
Affichages : 391
Taille : 22,7 Ko
    Je m'étais dit que le fait d'avoir idSituationEtudiant relié à chaque cours suivi par chaque étudiant me permet de savoir à quoi cela correspond (est-ce un cours de première année obligatoire ? Il s'agit du combientième stage obligatoire etc.

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 636
    Billets dans le blog
    10
    Par défaut
    D'une façon générale, en dehors des FK et à quelques très rares exceptions près, les redondances sont à fuir comme la peste, donc sauf explications et contexte particulier, je maintiens que dupliquer les attributs d'une table dans une autre n'est pas une bonne solution.

    Dans le cas présent, comme l'articulation des différentes tables n'est pas clair pour moi, je ne suis pas en mesure de donner la requête clefs en mains.
    Comme l'a suggéré Michel Priori plus haut, un shéma des relations entre les tables serait fort utile, mais avec toutes les tables mises en oeuvre

  11. #11
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 917
    Par défaut
    Salut à tous.

    Citation Envoyé par anouka
    comme l'articulation des différentes tables n'est pas clair pour moi
    Ce n'est pas clair pour moi aussi.

    @+

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 30
    Par défaut
    Merci pour la persévérance à comprendre pour m'aider
    Et voilà le schéma des tables (les trois dernières tables en bas ne vont pas aider à la compréhension, il n'y a pas le détail, c'est fait exprès)
    Pour l'instant, idSituationEtudiant n'est pas rempli dans acd_coursEtud (nouvelle colonne), mais j'espère trouver une requête pour faire une insertion avec les bonnes données depuis la table acd_situationEtudiant. A chaque cours suivi par un étudiant correspond un identifiant de situationEtudiant (pour pouvoir ensuite savoir si ce cours suivi est un cours de premier/second/troisième cycle et s'il est obligatoire ou non). Pour les stages, ça se complique, car pour un même cours nommé "STS"(stage hebdomadaire) obligatoire, l'étudiant doit avoir suivi deux "cours stage" pendant le premier cycle, le deuxième cycle et le troisième cycle. A un identifiant de situationEtudiant correspond plusieurs idCoursEtud
    J'ai appelé cette table situationEtudiant (dites-moi si vous pensez à un meilleur nom) car elle a pour but de pouvoir récupérer les infos nécessaires pour faire un PDF avec le nom de l'étudiant et les crédits déjà faits et manquants selon les diplômes (un an, deux ans, trois ans), en quelque sorte "sa situation" au regard des diplômes
    Nom : table.png
Affichages : 556
Taille : 109,3 Ko

Discussions similaires

  1. Insert into à partir de données d'une autre table
    Par enterprise dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/06/2018, 11h48
  2. Problème d'insertion de données dans une nouvelle table
    Par sab_info dans le forum Développement
    Réponses: 3
    Dernier message: 04/02/2013, 10h40
  3. Réponses: 3
    Dernier message: 18/12/2009, 12h33
  4. insert des données sur une autre table
    Par dngaya dans le forum Adaptive Server Enterprise
    Réponses: 2
    Dernier message: 18/02/2009, 15h21
  5. récupérer juste les données d'une autre table
    Par rangernoir dans le forum Access
    Réponses: 5
    Dernier message: 13/09/2005, 14h52

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