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 :

Requête de jointure


Sujet :

MySQL

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 60
    Points
    60
    Par défaut Requête de jointure
    Bonjour,

    je suis en train de réaliser une application web notons que une autre version de mon application existe sur windev avec la même base de données(une copie de base sur windev et une autre sur MYSQL).

    je suis en train de créer une méthode qui permet de mettre à jour les 2tables de 2base de donnée càd s'il ya une modification de base de données avec l'application web cette methode doit etre exécuté (thread) en parallèle pour mettre à jour la base de donnée sur windev.

    Est il possible d'utiliser les requète de jointure (inner join) sur 2 base de données qui ne sont pas sur le meme serveur ?

  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 foufou.mr.

    Citation Envoyé par foufou.mr
    Est il possible d'utiliser les requêtes de jointure (inner join) sur 2 base de données qui ne sont pas sur le même serveur ?
    Il est possible de faire une jointure entre deux bases différentes sur le même serveur MySql.
    Comme vous avez deux serveurs différents, je pense que ce n'est pas possible.
    Est-ce que les serveurs sont sur le même ordinateur ?

    Votre problème, c'est que dans la base de données du serveur 1, vous ne savez pas ce qui a changé.
    Et vous désirez répercuter les changements dans la base de données du serveur 2.

    Pour commencer, vous devez préparer le terrain, à savoir sauvegarder dans une table vos modifications.
    Nommons cette table "hist" comme historique.
    Il y a trois cas qui peuvent arriver :
    --> une création de ligne.
    --> une suppression de ligne.
    --> une modification de ligne.

    Pour gérer cela, une seule solution, les triggers.

    Que devez-vous mettre dans la table "Hist" ?
    --> La date du jour.
    --> L'heure du jour, si cela a de l'importance.
    --> l'action ("S" pour suppression, "C" pour création et "M" pour modification).
    --> Le nom de la table.
    --> l'identifiant de la ligne pour la table ci-dessus.
    --> L'ensemble des autres colonnes de la ligne.

    Est-ce que la répercussion doit être immédiate, ou l'on peut attendre un moment creux dans la journée ?

    Comment récupérer les modifications ?
    C'est très simple, il suffit de faire un "select" sur la table avec comme critère, la date et l'heure.
    Par exemple, pour une journée entière, vous récupérer que les lignes ayant la date du "2016-03-31".
    Si vous faites cela disons quatre fois par jour, il suffit de définir quatre intervalles :
    --> période 1 = début : "2016-03-31 00:00:00" compris et fin "2016-03-31 06:00:00" non compris.
    --> période 2 = début : "2016-03-31 06:00:00" compris et fin "2016-03-31 12:00:00" non compris.
    --> période 3 = début : "2016-03-31 12:00:00" compris et fin "2016-03-31 18:00:00" non compris.
    --> période 4 = début : "2016-03-31 18:00:00" compris et fin "2016-04-01 00:00:00" non compris.
    J'espère que vous avez compris le principe des intervalles.

    Comment faire le script ?
    En espérant que la volumétrie est faible, vous devez dans la première partie, faire :
    --> connexion au serveur 1, et à la base 1.
    --> vous récupérez le résultat du sélect précédent (celui de la table "hist").
    --> pour chaque ligne lu, vous la stockez dans un fichier séquentiel en faisant en sorte que tout soit lisible (sous forme de chaîne de caractères).

    Dans la seconde partie, vous devez faire :
    --> connexion au serveur 2, et à la base 2.
    --> vous lisez votre fichier séquentiel ligne par ligne.
    --> vous dispatcher la ligne vers la table qui va subir l'action.
    --> vous faites l'action ==> "S" pour suppression, "C" pour création et "M" pour modification, sur la table.

    Cela permet d'automatiser un transfert de données entre deux serveurs.

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

  3. #3
    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 foufou.mr.

    Je vous communique un exemple que j'ai fait pour un autre membre de ce forum et qui est similaire à votre demande.
    Il faudra faire quelques réajustement afin de correspondre à votre problème.
    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
    --------------
    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 `hist`
    --------------
     
    --------------
    CREATE TABLE `hist`
    ( `id`        integer unsigned  NOT NULL,
      `visible`   tinyint           NOT NULL,
      `lib`       varchar(255)      NOT NULL,
      `hist_date` date              NOT NULL,
      `hist_time` time              NOT NULL,
      `hist_user` varchar(255)      NOT NULL,
      `hist_comm`    char(006)      NOT NULL,
      `hist_rang` integer unsigned  NOT NULL auto_increment primary key
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`        integer unsigned  NOT NULL AUTO_INCREMENT primary key,
      `visible`   tinyint           NOT NULL,
      `connexion` bigint unsigned   NOT NULL,
      `lib`       varchar(255)      NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `ajout`
    --------------
     
    --------------
    CREATE TRIGGER `ajout`
    AFTER INSERT ON `test`
    FOR EACH ROW BEGIN
            insert into `hist` (`id`,`lib`,`visible`,`hist_date`,`hist_time`,`hist_user`,`hist_comm`) values
            (new.id, new.lib, new.visible, current_date(), current_time(), current_user(), "insert");
    END
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `modif`
    --------------
     
    --------------
    CREATE TRIGGER `modif`
    BEFORE update ON `test`
    FOR EACH ROW BEGIN
            declare _comm char(06);
     
            if (new.visible = 0) then
                 set _comm = "erase ";
            else set _comm = "update";
            end if;
     
            if (old.connexion = new.connexion) then
                    insert into `hist` (`id`,`lib`,`visible`,`hist_date`,`hist_time`,`hist_user`,`hist_comm`) values
                    (old.id, old.lib, old.visible, current_date(), current_time(), current_user(), _comm);
            end if;
    END
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `suppr`
    --------------
     
    --------------
    CREATE TRIGGER `suppr`
    BEFORE delete ON `test`
    FOR EACH ROW BEGIN
            insert into `hist` (`id`,`lib`,`visible`,`hist_date`,`hist_time`,`hist_user`,`hist_comm`) values
            (old.id, old.lib, old.visible, current_date(), current_time(), current_user(), "delete");
    END
    --------------
     
    --------------
    insert into test (lib,visible,connexion) VALUES ('un',1,0),('deux',1,0),('trois',1,0)
    --------------
     
    --------------
    update test set lib = 'quatre' where lib like 'deux'
    --------------
     
    --------------
    delete from test where lib like 'trois'
    --------------
     
    --------------
    insert into test (lib,visible,connexion) VALUES ('cinq',1,0)
    --------------
     
    --------------
    update test set visible = 0 where lib like 'quatre'
    --------------
     
    --------------
    update test set connexion = connexion + 1
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+---------+-----------+--------+
    | id | visible | connexion | lib    |
    +----+---------+-----------+--------+
    |  1 |       1 |         1 | un     |
    |  2 |       0 |         1 | quatre |
    |  4 |       1 |         1 | cinq   |
    +----+---------+-----------+--------+
    --------------
    select * from hist
    --------------
     
    +----+---------+--------+------------+-----------+----------------+-----------+-----------+
    | id | visible | lib    | hist_date  | hist_time | hist_user      | hist_comm | hist_rang |
    +----+---------+--------+------------+-----------+----------------+-----------+-----------+
    |  1 |       1 | un     | 2016-04-01 | 02:12:00  | root@localhost | insert    |         1 |
    |  2 |       1 | deux   | 2016-04-01 | 02:12:00  | root@localhost | insert    |         2 |
    |  3 |       1 | trois  | 2016-04-01 | 02:12:00  | root@localhost | insert    |         3 |
    |  2 |       1 | deux   | 2016-04-01 | 02:12:00  | root@localhost | update    |         4 |
    |  3 |       1 | trois  | 2016-04-01 | 02:12:00  | root@localhost | delete    |         5 |
    |  4 |       1 | cinq   | 2016-04-01 | 02:12:00  | root@localhost | insert    |         6 |
    |  2 |       1 | quatre | 2016-04-01 | 02:12:00  | root@localhost | erase     |         7 |
    +----+---------+--------+------------+-----------+----------------+-----------+-----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Chaque action sur la table "test" sera enregistré dans la table "hist".
    Il suffit ensuite de récupérer ce dont vous avez besoin pour faire le transfert vers l'autre serveur.

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

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 60
    Points
    60
    Par défaut
    Je vous remercie infiniment pour votre réponse vraiment c'est très claire .

    Est-ce que les serveurs sont sur le même ordinateur ?

    les deux ne sont pas sur le meme ordinateur.

    Les deux bases ne sont pas MYSql(une mysql et autre windev).
    Est ce que si possible d'utiliser les triggers entre ces deux bases ?

    Merci

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 60
    Points
    60
    Par défaut
    Bonjour,

    Noter que je dois faire la synchronistaion entre ces deux bases de données via un appel de méthodes existant sur un web service SOAP écrit en php en utilisant les threds afin qu'il sera exécuter en parallèle de façon automique.

    Est il possible d'utiliser les triggers avec le web service ?

  6. #6
    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 foufou.mr.

    Citation Envoyé par foufou.mr
    Citation Envoyé par Artemus24
    Est-ce que les serveurs sont sur le même ordinateur ?
    les deux ne sont pas sur le même ordinateur.
    C'était juste pour savoir. Cela ne pose aucun problème.
    J'ai fait un traitement similaire où depuis mon ordinateur, j'accède à ma base de données qui est hébergé chez Alwaysdata.
    Et ceci afin de récupérer les données distantes pour les décharger et les traiter sur mon ordinateur.

    Citation Envoyé par foufou.mr
    Les deux bases ne sont pas MYSql(une mysql et autre windev).
    Est-ce qu'il est possible d'utiliser les triggers entre ces deux bases ?
    Un trigger, c'est un déclencheur en relation avec la base et la table où il a été déclaré.
    Il se déclenche que si vous faites une opération sur la table en question.

    Si je vous ai parlé des triggers, c'est juste pour récupérer à partir de la table "hist", les opérations que vous allez transférer vers l'autre serveur.
    Sans cette table "hist", vous êtes obligés de faire un traitement supplémentaire, qui consiste à créer la différence entre votre base distante datant de J-1 avec votre base datant de J.

    Je suppose que vous voulez parler de la relation entre votre serveur mysql et votre autre serveur distant windev.
    A vrai dire, je n'ai jamais utilisé les triggers en dehors de la base de données pour laquelle, ils ont été déclarés.
    Même pas entre deux bases de données dans le même serveur.
    Je pense que, sur un serveur autre que MySql et distant, cela ne soit pas possible.
    C'est le traitement écrit en php qui va faire la jonction entre vos deux bases de données.

    Citation Envoyé par foufou.mr
    Est il possible d'utiliser les triggers avec le web service ?
    Est-ce que vous connaissez les triggers ? Je le rappelle, un trigger, c'est un déclencheur.
    Il ne sert pas à communiquer, mais juste à faire des traitements disons automatiques suite à une opération sur une table.

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

Discussions similaires

  1. Requête avec jointures
    Par Corben dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/11/2004, 12h55
  2. Réponses: 6
    Dernier message: 20/09/2004, 15h26
  3. Mise à jour de table impossible après requête avec jointure
    Par sto dans le forum Bases de données
    Réponses: 5
    Dernier message: 17/03/2004, 13h24
  4. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  5. Réponses: 14
    Dernier message: 17/03/2003, 18h31

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