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 selection update depuis plusieurs tables est-il possible ?


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2023
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2023
    Messages : 18
    Par défaut insertion selection update depuis plusieurs tables est-il possible ?
    bonjour, tout le monde je vous prie de bien vouloir m'aider à propos d'une requête UPDATE

    j'ai une table t_employee comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    +-------------+------------+--------------------+
    | id          | employee_id| N_employe          |
    +-------------+------------+--------------------+
    |         1   |        99  |    chris           |
    +-------------+------------+--------------------+
    |         2   |        100 |    Adel            |
    +-------------+------------+--------------------+
    |         3   |        101 |    Beatrice        |
    +-------------+------------+--------------------+
    |         4   |        102 |    emy             |
    +-------------+------------+--------------------+
    une table t_affectation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    +---------------+------------+-----------+
    |    id_a       |employee_id | id_service|
    +---------------+------------+-----------+
    |     1         |        1   |        12 |
    |     2         |        2   |        12 |
    |     3         |        3   |        12 |
    |     4         |        4   |        12 |
    +---------------+------------+-----------+
    Table t_service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    +---------------+------------+
    |    id_srv     |libelle_serv|
    +---------------+------------+
    |     12        |   Finance  |
    +---------------+------------+
    je possède une machine de pointage qui enregistre le pointage sur une table appelée t_attendance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    +-------------+---------------------+------------------------+----------------+-----------+-----------+
    | id_p        | employee_id         | Nom   | Date_Pointages | Heure_pointage | statut    |  service  |
    +-------------+---------------------+------------------------+----------------+-----------+-----------+
    |           1 |                99   | chris | 2023-02-26     |  09:10:53      |  présent  |  Finance  |
    +-------------+---------------------+------------------------+----------------+-----------+-----------+
    je cherche une requette UPDATE a fin de ramener tout l'autre personnels qui n'ont pas pointé pour avoir la table t_attendance comme suit sans que le id 99 ne se repètent avec le statut Absent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    +-------------+---------------------+-------------------------+----------------+-----------+-----------+
    | id_p        | employee_id         | Nom    | Date_Pointages | Heure_pointage | statut    |  service  |
    +-------------+---------------------+-------------------------+----------------+-----------+-----------+
    |           1 |                99   | chris  | 2023-02-26     |  09:10:53      |  présent  |  Finance  |
    +-------------+---------------------+-------------------------+----------------+-----------+-----------+ 
    |           2 |                100  | Adel   | 2023-02-26     |  00:00:00      |  absent   |  Finance  |
    +-------------+---------------------+-------------------------+----------------+-----------+-----------+ 
    |           3 |                102  |Beatrice| 2023-02-26     |  00:00:00      |  absent   |  Finance  |
    +-------------+---------------------+-------------------------+----------------+-----------+-----------+ 
    |           4 |                103  | DAVID  | 2023-02-26     |  00:00:00      |  absent   |  Finance  |
    +-------------+---------------------+-------------------------+----------------+-----------+-----------+
    et merci pour vous

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 358
    Billets dans le blog
    17
    Par défaut
    Tes tables sont vraiment comme ça ? En franglais, avec parfois des majuscules, parfois des minuscules, parfois des abréviations, d'autres fois non. Il y a un travail d'harmonisation nécessaire.

    je possède une machine de pointage qui enregistre le pointage sur une table appelée t_attendance
    Cette table ressemble à une vue (colonnes "Nom" et "service" en toutes lettres).
    À quoi correspond t_attendance.Nom ? L'exemple donne "DAVID" alors que t_employee.employee_id[ID=99].N_employe vaut "chris".

    je cherche une requette UPDATE a fin de ramener tout l'autre personnels qui n'as pas pointé pour avoir la table t_attendance comme suit sans que le id 99 ne se repètent avec le statut Absent
    Un UPDATE modifie des lignes existantes, toi tu veux en insérer des nouvelles, il te faut INSERT.
    Où as-tu l'info à savoir qui est censé pointer / être présent ?

    Mais **attention**, tu t'orientes vers un modèle de données douteux (pour rester poli) et une mauvaise solution.

    Tu as une table contenant des pointages, garde-la pour cet usage exclusif, et pas pour mixer des données sur les absences. Améliore-la plutôt => Ex. des noms d'employés ou de services n'ont rien à y faire en toutes lettres.

    Concernant les absences. Ces données calculées ont plutôt leur place dans un simple SELECT (voir plus bas), ou une vue. **À la limite** tu créés et maintiens à jour une table de rapport de présence/absence à partir de la table des pointages. Mais tu ne touches pas à la table des pointages, qui doit rester propre.

    Vérifier quels sont les employés ayant pointé ou non le 2023-02-26 avec une jointure externe (OUTER JOIN) sur la table des pointages :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT ALL
        e.N_employe, s.libelle_srv,
        COALESCE(at.statut, 'Absent') AS statut -- Si pas de statut de présence dans les pointages, alors absent 
    FROM t_employee AS e
    INNER JOIN t_affectation AS a ON e.id = a.employee_id
    INNER JOIN t_service AS s ON a.id_service = s.id_srv
    LEFT OUTER JOIN t_attendance AS at ON TRUE
        AND e.employee_id = at.employee_id
        AND s.liblle_serv = ta.service
        AND at.Date_Pointages = '2023-02-26'
    J'ai mis le service dans le critère de jointure, mais ne connaissant pas tes règles de gestion, pas sûr que ce soit pertinent => 1 employé peut-il pointer le même jour pour plusieurs services ? La table des affectations et la colonne t_attendance.service peuvent laisser penser que oui.

    Par ailleurs faire un jointure sur un libellé n'est jamais très bon, si le service est vraiment nécessaire dans les pointages alors il faudrait y placer l'ID du service, et pas son nom.

  3. #3
    Membre averti
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2023
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2023
    Messages : 18
    Par défaut
    Bonjour , Monsieur Séb tout d'abord je tiens à vous remercier pour le temps que vous m'avez consacré pour résoudre mon problème

    ce que je comprend de votre pertinente réponse dois je crée une nouvelle table par exemple t_historique pour ramener tout les autres employés qui n'ont pas pointé avec statut Absent et celui qui a pointé avec le statut présent, et comme vous dites laissé la table t_attendance tranquille ???

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 139
    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 : 7 139
    Par défaut
    Salut à tous.

    Code mysql : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `t_employee`
    --------------
     
    --------------
    CREATE TABLE `t_employee`
    ( `id`           integer unsigned NOT NULL auto_increment primary key,
      `employee_id`  integer unsigned NOT NULL,
      `n_employee`   varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `t_employee` (`employee_id`,`n_employee`) values
      (99,'Chris'),(100,'Adel'),(101,'Béatrice'), (102,'Amy')
    --------------
     
    --------------
    select * from `t_employee`
    --------------
     
    +----+-------------+------------+
    | id | employee_id | n_employee |
    +----+-------------+------------+
    |  1 |          99 | Chris      |
    |  2 |         100 | Adel       |
    |  3 |         101 | Béatrice   |
    |  4 |         102 | Amy        |
    +----+-------------+------------+
    --------------
    DROP TABLE IF EXISTS `t_affectation`
    --------------
     
    --------------
    CREATE TABLE `t_affectation`
    ( `id_a`         integer unsigned NOT NULL auto_increment primary key,
      `employee_id`  integer unsigned NOT NULL,
      `id_service`   integer unsigned NOT NULL
     ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `t_affectation` (`employee_id`, `id_service`) values
      (1,12),(2,12),(3,12),(4,12)
    --------------
     
    --------------
    select * from `t_affectation`
    --------------
     
    +------+-------------+------------+
    | id_a | employee_id | id_service |
    +------+-------------+------------+
    |    1 |           1 |         12 |
    |    2 |           2 |         12 |
    |    3 |           3 |         12 |
    |    4 |           4 |         12 |
    +------+-------------+------------+
    --------------
    DROP TABLE IF EXISTS `t_service`
    --------------
     
    --------------
    CREATE TABLE `t_service`
    ( `id_srv`       integer unsigned NOT NULL primary key,
      `libelle_srv`  varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `t_service` (`id_srv`,`libelle_srv`) values
      (12,'Finance')
    --------------
     
    --------------
    select * from `t_service`
    --------------
     
    +--------+-------------+
    | id_srv | libelle_srv |
    +--------+-------------+
    |     12 | Finance     |
    +--------+-------------+
    --------------
    DROP TABLE IF EXISTS `t_pointage`
    --------------
     
    --------------
    CREATE TABLE `t_pointage`
    ( `employee_id`  integer unsigned NOT NULL,
      `date`         date             NOT NULL,
      `time`         time             NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `t_pointage` (`employee_id`,`date`,`time`) values
      (99, '2023-03-04', '09:10:53')
    --------------
     
    --------------
    select * from `t_pointage`
    --------------
     
    +-------------+------------+----------+
    | employee_id | date       | time     |
    +-------------+------------+----------+
    |          99 | 2023-03-04 | 09:10:53 |
    +-------------+------------+----------+
    --------------
    drop view if exists `t_attendance`
    --------------
     
    --------------
    create view `t_attendance` as
        select t1.`employee_id`,
               t2.`n_employee`       as name,
               t1.`date`,
               t1.`time`,
               t1.`status`,
               t4.`libelle_srv`      as service
     
          from ( select `employee_id`,
                        `date`,
                        `time`,
                        'Présent'    as status
                   from `t_pointage`
     
                  union
     
                 select `employee_id`,
                        current_date as 'date',
                        '00:00:00'   as 'time',
                        'Absent'     as status
                   from `t_employee` as t1
                  where not exists (select 1 from `t_pointage` as t2 where t2.employee_id = t1.employee_id)
               ) as t1
     
    inner join `t_employee`     as t2
            on t2.employee_id = t1.employee_id
     
    inner join `t_affectation`  as t3
            on t3.id_a = t2.id
     
    inner join `t_service`      as t4
            on t4.id_srv = t3.id_service
    --------------
     
    --------------
    select * from `t_attendance`
    --------------
     
    +-------------+----------+------------+----------+---------+---------+
    | employee_id | name     | date       | time     | status  | service |
    +-------------+----------+------------+----------+---------+---------+
    |          99 | Chris    | 2023-03-04 | 09:10:53 | Présent | Finance |
    |         100 | Adel     | 2023-03-04 | 00:00:00 | Absent  | Finance |
    |         101 | Béatrice | 2023-03-04 | 00:00:00 | Absent  | Finance |
    |         102 | Amy      | 2023-03-04 | 00:00:00 | Absent  | Finance |
    +-------------+----------+------------+----------+---------+---------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...

    Cordialement.
    Artemus24.
    @+

  5. #5
    Membre averti
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2023
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2023
    Messages : 18
    Par défaut
    oh lala Monsieur Artemus24 vous êtes vraiment un génie

    Merci infiniment

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 358
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 358
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par xena_gueriere2000 Voir le message
    dois je crée une nouvelle table par exemple t_historique pour ramener tout les autres employés qui n'ont pas pointé avec statut Absent et celui qui a pointé avec le statut présent, et comme vous dites laissé la table t_attendance tranquille ???
    Je ne réponds pas à de nouvelles questions tant que les miennes n'ont pas obtenu de réponse

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 682
    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 682
    Billets dans le blog
    10
    Par défaut
    Je suis tout à fait d'accord avec les remarques de Seb concernant la structuration des tables.

    J'y ajoute que t_affectation semble avoir pour PK id_a et pour attributs employee_id et id_service
    Ca signifie qu'un même employé peut être affecté à plusieurs services.

    Il faut supprimer l'identifiant artificiel "id_a" de cette table associative et utiliser comme PK :

    • soit le couple (employee_id, id_service) comme PK si un employé reste dans le même service toute sa vie (très peu probable)
    • soit le couple (employee id, date début) comme PK avec l'identifiant du service comme attribut, si un un employé peut changer de service (plus vraisemblable)


    Bref, avant de vous préoccuper de la syntaxe des requêtes, commencez par structurer la base de données dans les règles de l'art, car une base mal structurée est la source de tous les maux (fiabilité, intégrité et performances désastreuses). La syntaxe des requête dépend bien évidemment de la structuration des tables.

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

Discussions similaires

  1. Insert depuis plusieurs tables - ORA-00933
    Par feldi dans le forum SQL
    Réponses: 9
    Dernier message: 11/01/2012, 17h43
  2. Update de plusieurs tables, import fichier csv sql loader
    Par fusuke dans le forum SQL*Loader
    Réponses: 2
    Dernier message: 18/05/2006, 16h08
  3. update sur plusieurs tables
    Par Jean-Matt dans le forum Langage SQL
    Réponses: 14
    Dernier message: 04/01/2006, 15h30
  4. select multiple sur plusieurs tables
    Par syl2095 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/12/2004, 16h48
  5. Réponses: 7
    Dernier message: 12/10/2004, 17h43

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