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

MySQL Discussion :

Récupérer une liste dans un champ en guise de tableau ou chaine séparé par des virgules


Sujet :

MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2002
    Messages : 733
    Points : 359
    Points
    359
    Par défaut Récupérer une liste dans un champ en guise de tableau ou chaine séparé par des virgules
    bonjour,
    j'ai une table tbl_vehicules(id_vehicule, nom_vehicule, matricule) et une table tbl_conducteurs(id_conducteur, id_vehicule, nom_conducteur, prénom_conducteur)

    sachant qu'un vehicule peut avoir plusieurs conducteur, je veux avoir un résultat de cette structure :
    __________________________________

    1| vehicule01| matricule01 | ("conducteur01 , conducteur02 , conducteur03)
    _____________________________________
    2| vehicule02| matricule02 | ("conducteur04, conducteur05, conducteur06)
    __________________________________________
    ....... etc

    dans le résultat on comprend que le vehicule01 possède 3 conducteurs (01, 02 et 03)

    je cherche une requete qui ressemble à select nom_vehicule, matricule, list_conducteur from tbl_vehicules

    sachant que list_conducteur est un tableau qui doit être récupéré de la table tbl_conducteurs

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 198
    Points : 8 421
    Points
    8 421
    Billets dans le blog
    17
    Par défaut
    Le modèle de données que tu donnes ne permet pas de faire le lien entre véhicules et conducteurs.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2002
    Messages : 733
    Points : 359
    Points
    359
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Le modèle de données que tu donnes ne permet pas de faire le lien entre véhicules et conducteurs.
    bonsoir,
    je viens de modifier mon modèle en ajoutant la clé étrangère id_vehicule, j'ai juste donné l'idée du problème que j'ai rencontré

    la solution que possède c'est en utilisant left joint, mais j'aurais autant de lignes qu'il y a de conducteurs pour chaque vehicule

    je veux avoir une seule ligne pour chaque vehicule

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 305
    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 305
    Points : 39 658
    Points
    39 658
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Dans la vraie vie, les règles de gestion sont

    RG001 : un véhicule peut être conduit par plusieurs personnes successivement, mais pas simultanément
    RG002 : une même personne peut conduire plusieurs véhicules successivement, mais pas simultanément

    De ces règles il ressort qu'une table associative entre véhicule et personne est indispensable puisqu'on a une cardinalité maximale "n" de chaque coté de l'association.
    Il n'y a donc pas de clef étrangère à positionner ni coté conducteur, ni coté véhicule.

    Le bon modèle de données est donc comme ci-dessous :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    create table VH_vehicule
          (  VH_ident    integer auto_increment   primary key
           , VH_immat    char(9) not null
          )
    ;
    create table PE_personne
          (  PE_ident    integer auto_increment   primary key
           , PE_nom      varchar(30) not null
           , PE_prenom   varchar(30) not null
          )
    ;
    create table CO_conduire
          (  VH_ident    integer     not null
           , PE_ident    integer     not null
           , CO_dtdeb    date        not null
           , CO_dtfin    date        not null
           , primary key (VH_ident, CO_dtdeb)
           , foreign key (VH_ident)
             references VH_vehicule(VH_ident)
             on update cascade
             on delete restrict
           , foreign key (PE_ident)
             references PE_personne(PE_ident)
             on update cascade
             on delete restrict  
          )
    ;

    Insertion d'un petit jeu d'essai dans ces tables :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    insert into VH_vehicule(VH_immat)
    values ('11-ABD-45') 
         , ('38-BEF-66')
         , ('40-GAX-38')
         , ('29-ZUT-17')
    ;
    insert into PE_personne(PE_nom, PE_prenom)
    values ('Naudin', 'Fernand') 
         , ('Volfoni', 'Raoul')
         , ('Volfoni', 'Paul')
    ;
    insert into CO_conduire (VH_ident, PE_ident, CO_dtdeb, CO_dtfin)
    values (1, 1, '2023-01-01', '2023-12-31')
         , (1, 3, '2024-01-01', '9999-12-31')
         , (2, 1, '2020-06-30', '2023-01-10')
         , (2, 3, '2023-01-11', '2023-04-18')
         , (2, 2, '2023-04-19', '9999-12-31')
         , (4, 1, '2023-01-11', '9999-12-31')
    ;

    Requête pour obtenir le résultat souhaité, il faut utiliser la fonction GROUP_CONCAT associée à un regroupement GROUP BY :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select VH.VH_ident
         , VH.VH_immat
         , group_concat(PE.PE_nom, ' ', PE.PE_prenom
                        order by CO.CO_dtdeb
                        separator ', '
                       ) 
           as "Conducteurs successifs"
    from VH_vehicule as VH
    left join CO_conduire as CO
       on CO.VH_ident = VH.VH_ident
    left join PE_personne as PE
       on PE.PE_ident = CO.PE_ident
    group by VH.VH_ident
          , VH.VH_immat

    Résultat :

    Nom : Sans titre.png
Affichages : 19
Taille : 5,8 Ko

    On voit la liste des conducteurs par véhicules, avec une particularité pour le 3e véhicule qui n'a jamais été conduit.

    À noter :
    • dans la table conduire, l'identifiant de la personne PE_personne ne contribue pas à la PK, c'est ce qui permet de vérifier la règle de gestion RG001.
      Au niveau conceptuel (MCD) cette règle se représente par une flèche de l'association (conduire) en direction de l'entité-type [PERSONNE] ;
    • dans ce script, je n'ai pas vérifié qu'une personne ne conduisait pas plus d'un seul véhicule à un instant "t" (règle RG002), il faudra ajouter un déclencheur (TRIGGER) pour ce besoin

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2002
    Messages : 733
    Points : 359
    Points
    359
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Requête pour obtenir le résultat souhaité, il faut utiliser la fonction GROUP_CONCAT associée à un regroupement GROUP BY :
    super, merci pour votre aide, c'est ce que je cherche.
    encore merci.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 305
    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 305
    Points : 39 658
    Points
    39 658
    Billets dans le blog
    9
    Par défaut
    Le plus important n'est pas tant l'utilisation de la fonction GROUP_CONCAT que la bonne modélisation de la base de données : il vous faut donc 3 tables, "véhicules", "personnes" et la table associative "conduire"

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 06/06/2023, 13h24
  2. champ d'une liste lié à une liste dans un autre site
    Par guintolli dans le forum SharePoint
    Réponses: 8
    Dernier message: 08/07/2008, 14h51
  3. Réponses: 3
    Dernier message: 10/04/2008, 13h50
  4. copier un champ d'une liste dans une autre liste
    Par biba158 dans le forum Général Java
    Réponses: 4
    Dernier message: 04/01/2008, 14h12
  5. Source d'un Champ définie avec une liste dans Access
    Par Mymi dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/10/2006, 21h23

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