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 :

Mettre à jour une table avec les valeurs des champs d'une autre table


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai Avatar de MikeCharlie
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2013
    Messages : 13
    Points : 19
    Points
    19
    Par défaut Mettre à jour une table avec les valeurs des champs d'une autre table
    Besoin d'aide svp pour terminer ma requête en Mysql pour un challenge interne à mon club de Tennis :
    Je fais compléter une table 'Matchs' au moyen d'un formulaire d'enregistrements par la méthode POST
    après une routine de calculs qui attribue un nombre de points selon le score en 2 sets ou en 3 sets.
    (Je suis chez Free et donc en php 5.1 et pas de MySqli)

    J'ai donc 2 tables dans une base Mysql Tournoi qui contiennent:

    Table "Matchs" :
    nomgagnant (varchar,30)
    nomperdant (varchar,30)
    pointsgagnant (tinyint,1)
    pointsperdant (tinyint,1)

    Table "Membres" :
    nom (varchar,30)
    nbmatchs (int,4)
    nbpoints (int,4)

    Voici la requete mysql qui alimente par des variables les valeurs des champs de la table "Matchs" : (et qui fonctionne bien, merci !)

    // Sélection de la table Matchs et exécution de l'insertion du Résultat
    $resultet ='SELECT * FROM Matchs ORDER BY id';
    $resultat=mysql_query($resultet);

    $asql="INSERT INTO Matchs SET
    nomgagnant='$nomgagnant',
    nomperdant='$nomperdant',
    score='$score',
    pointsgagnant='$pointsgagnant',
    pointsperdant='$pointsperdant'";

    $resultat =mysql_query($asql);
    // Fin de la requête ---------------------------------------------------------

    // Problème :
    Voilà plusieurs jours que je planche sur une requête pour calculer et transférer
    les valeurs des champs de la table "Matchs" vers la table "Membres", sachant que pour chaque 'Membre.nom' :

    - la valeur du champ 'Membres.nom' figure plusieurs fois dans la table "Matchs"
    en tant que 'Membres.nomgagnant' mais aussi en tant que 'Membres.nomperdant' (on récupère des points en gagnant mais aussi en perdant)

    - Le champ 'Membres.nbpoints' doit être la somme de la valeur des champs 'Matchs.pointsgagnant' + 'Matchs.pointsperdant' pour chaque fois
    que 'Membres.nom' sera trouvé dans 'Matchs.nomgagnant' 'OU Matchs.nomperdant'

    - le champ 'Membres.nbmatchs' sera la somme des enregistrements de la Table "Matchs" chaque fois où la valeur de ce champ sera trouvée dans
    'Matchs.nomgagnant' OU 'Matchs.nomperdant

    (une boucle avec des SELECT, UPDATE, COUNT, INNER JOIN..... ou REPLACE ???
    j'ai essayé en vain.... après des jours de vaines tentatives et recherches !!!!)

    C'est ma première expérience en php Mysql et je ne suis qu'un débutant " trop âgé" dans ce domaine !
    Pourriez-vous me proposer une solution ?)
    Merci... Il ne me manque que çà pour finir mon site !

    Voir sur ce lien le tableau final que je souhaite obtenir à partir de mes Tables "Matchs" et "Membres" :
    Ne fonctionne pas à l'heure actuelle, je mets à jour la table en manuel (!)
    http://tennisclubsaintpaul.free.fr/Affiche-Points.php

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    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 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut MikeCharlie.

    La conception de ta base de données n'est pas du tout adaptée à ce genre de rencontre.
    Il y a des répétitions inutiles comme les noms des joueurs dans la table des matchs.
    Et un plus gros problème, tu peux avoir un match où le même joueur peut être à la fois gagnant et perdant dans un même match.

    Pour résoudre ton problème, je suis parti de ta conception de ta base de données.
    Code : 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
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `membres`
    --------------
     
    --------------
    CREATE TABLE `membres`
    (
      `id`        integer unsigned NOT NULL AUTO_INCREMENT,
      `nom`       varchar(255)     NOT NULL,
      `nbmatchs`  integer          NOT NULL,
      `nbpoints`  integer          NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO membres (`nom`,`nbmatchs`,`nbpoints`) VALUES
    ('albert',  0, 0),
    ('maurice', 0, 0),
    ('leon',    0, 0),
    ('patrick', 0, 0)
    --------------
     
    --------------
    select * from membres
    --------------
     
    +----+---------+----------+----------+
    | id | nom     | nbmatchs | nbpoints |
    +----+---------+----------+----------+
    |  1 | albert  |        0 |        0 |
    |  2 | maurice |        0 |        0 |
    |  3 | leon    |        0 |        0 |
    |  4 | patrick |        0 |        0 |
    +----+---------+----------+----------+
    --------------
    DROP TABLE IF EXISTS `matchs`
    --------------
     
    --------------
    CREATE TABLE `matchs`
    (
      `id`            integer unsigned NOT NULL AUTO_INCREMENT,
      `nomgagnant`    varchar(255)     NOT NULL,
      `nomperdant`    varchar(255)     NOT NULL,
      `pointgagnant`  integer          NOT NULL,
      `pointperdant`  integer          NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO matchs (`nomgagnant`,`nomperdant`,`pointgagnant`,`pointperdant`) VALUES
    ('leon',    'patrick', 2, 1),
    ('patrick', 'albert',  5, 4),
    ('albert',  'maurice', 3, 2),
    ('maurice', 'leon',    4, 2)
    --------------
     
    --------------
    select * from matchs
    --------------
     
    +----+------------+------------+--------------+--------------+
    | id | nomgagnant | nomperdant | pointgagnant | pointperdant |
    +----+------------+------------+--------------+--------------+
    |  1 | leon       | patrick    |            2 |            1 |
    |  2 | patrick    | albert     |            5 |            4 |
    |  3 | albert     | maurice    |            3 |            2 |
    |  4 | maurice    | leon       |            4 |            2 |
    +----+------------+------------+--------------+--------------+
    --------------
    create temporary table temp1 (
      `nom`    varchar(255) NOT NULL,
      `plus`   integer      NOT NULL,
      `moins`  integer      NOT NULL
    )
    --------------
     
    --------------
    insert into temp1
    select nom,
           sum(plus)  as plus,
               sum(moins) as moins
    from (
            select   nomgagnant        as nom,
                             sum(pointgagnant) as plus,
                             sum(pointperdant) as moins
            from     matchs
            group by nomgagnant
            union all
            select   nomperdant        as nom,
                             sum(pointgagnant) as plus,
                             sum(pointperdant) as moins
            from     matchs
            group by nomperdant
    ) as x
    group by nom
    --------------
     
    --------------
    select * from temp1
    --------------
     
    +---------+------+-------+
    | nom     | plus | moins |
    +---------+------+-------+
    | albert  |    8 |     6 |
    | leon    |    6 |     3 |
    | maurice |    7 |     4 |
    | patrick |    7 |     5 |
    +---------+------+-------+
    --------------
    update membres as m, temp1 as t
    set    m.nbpoints = m.nbpoints + t.plus + t.moins
    where  m.nom      = t.nom
    --------------
     
    --------------
    select * from membres
    --------------
     
    +----+---------+----------+----------+
    | id | nom     | nbmatchs | nbpoints |
    +----+---------+----------+----------+
    |  1 | albert  |        0 |       14 |
    |  2 | maurice |        0 |       11 |
    |  3 | leon    |        0 |        9 |
    |  4 | patrick |        0 |       12 |
    +----+---------+----------+----------+
    --------------
    create temporary table temp2 (
      `nom`   varchar(255) NOT NULL,
      `nbre`  integer      NOT NULL
    )
    --------------
     
    --------------
    insert into temp2
    select nom,
           sum(nbre) as nbre
    from (
            select   nomgagnant as nom,
                             count(*)   as nbre
            from     matchs
            group by nomgagnant
            union all
            select   nomperdant as nom,
                             count(*)   as nbre
            from     matchs
            group by nomperdant
    ) as x
    group by nom
    --------------
     
    --------------
    select * from temp2
    --------------
     
    +---------+------+
    | nom     | nbre |
    +---------+------+
    | albert  |    2 |
    | leon    |    2 |
    | maurice |    2 |
    | patrick |    2 |
    +---------+------+
    --------------
    update membres as m, temp2 as t
    set    m.nbmatchs = t.nbre
    where  m.nom      = t.nom
    --------------
     
    --------------
    select * from membres
    --------------
     
    +----+---------+----------+----------+
    | id | nom     | nbmatchs | nbpoints |
    +----+---------+----------+----------+
    |  1 | albert  |        2 |       14 |
    |  2 | maurice |        2 |       11 |
    |  3 | leon    |        2 |        9 |
    |  4 | patrick |        2 |       12 |
    +----+---------+----------+----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Passe ton sujet à résolu si c'est le cas et tu me mets des '+1'.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. récupérer les valeurs des champs d'une autre page
    Par owenho dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/02/2013, 00h47
  2. Réponses: 1
    Dernier message: 31/05/2008, 13h00
  3. Lien avec les valeurs des champs HTML?
    Par insane_80 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/07/2007, 08h45
  4. [MySQL] remplir un tableau avec les noms des champs d'une table
    Par solidaritok dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 05/04/2007, 13h47
  5. Réponses: 2
    Dernier message: 01/08/2006, 13h38

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