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

SQL Procédural MySQL Discussion :

Aide pour une requete de comparaison de table et d'insertion


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut Aide pour une requete de comparaison de table et d'insertion
    Bonjour


    Il est vraiment très rare que je fasse appel a vous car je préfère largement apprendre et découvrir pas moi même, mais pour ce qui concerne ce problème actuel je ne maitrise absoumement pas les requete mysql.

    J'aurais besoin d'avoir une requete dont le but est de checker dans une base X la table "user" qui contient différent champs, les 2 qui m'interessent sont les champ "nom" et le champs "groupe",

    A coté de cela j'ai une base Y qui contient des tables, dont une qui s'appelle "compte" et qui contient les champs A,B,C,D,E,F,G ayant pour fonction:

    A>>id user qui est générer de facon chronologique int(11) NOT NULL auto_increment
    B> qui devra toujours avoir la valeur de 1 int(11) default NULL
    C> qui devra toujours avoir la valeur -1 int(11) default NULL
    D> qui devra etre égale aux champs user de la table X varchar(40) default NULL
    E> qui devra toujours avoir pour valeur le mot "toto" varchar(80) default NULL
    F> doit etre généré en fonction de la date du jour: jjmmaaahhmmss varchar(20) default NULL
    G> qui devra avoir la valeur <null> varchar(20) default NULL


    La requete devra faire en sorte que si le champs groupe de la tabel X à pour valeur 18 alors la requete remplira les champs dans la base Y en faisant en sorte que le contenu du champs D de la tabel Y soite égale au contenu du champs "user" de la table X.

    Le but de la manoeuvre étant de faire en sorte que l'ajout d'un membre dans la table X se répercute également dans la table Y une fois la requete exéxutée et automatisée.

    Amicalement

  2. #2
    Membre Expert Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Par défaut
    Salut,

    Peux-tu nous en dire plus sur le contexte applicatif du problème ?

    Typiquement tu pourrais gérer cette insertion dans la table Y dans le code de ton application (s'il y en a une), ou l'automatiser avec un trigger sous MySQL 5.0 +

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut
    J'en suis a la page 64 du forum et j'ai vu qu'il existait une fonction trigger, celle-ci de ce que j'ai compris me permettrais également de faire en sorte que si je modifi le group de la table X alors la modification sera automatiquement détecté et pourrait aussi incrémenter ma table X ce qui serai plus pratique ^^

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    A quoi servent tes colonnes B, C, E et G ?
    Ta colonne F devrait être en TIMESTAMP et non en VARCHAR.
    Pourquoi ne pas donner des noms de colonnes explicites ?

    [EDIT] la page 64 du forum ???

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut
    Bah oui la page 64, comme je n'ai rien trouvé de flagrant dans le moteur de recherche et bien je reagarde tous les topic crés

    Pour expliquer un peu plus, je dispose de 2 base, une est la base d'un forum et l'autre la base d'un serveur vocal

    Ce qui m'interesse c'est la table user du forum et la table client du serveur vocal, la table user contient des centaines de membre enregistré, parmis ces membres il y en a qui sont dans un group particulier a savoir le groupe 18, ce que je veux c'est que si un membres est dans le groupe 18 de la table user du forum alors la requete creera une entré dans la table client de la base serveur vocal en rensigneant les champs.

    table du serveur vocal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE `clients` (
      `i_client_id` int(11) NOT NULL auto_increment,
      `i_client_server_id` int(11) default NULL,
      `b_client_privilege_serveradmin` int(11) default NULL,
      `s_client_name` varchar(40) default NULL,
      `s_client_password` varchar(80) default NULL,
      `dt_client_created` varchar(20) default NULL,
      `dt_client_lastonline` varchar(20) default NULL,
      PRIMARY KEY  (`i_client_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;

    table du forum:

    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
     
    CREATE TABLE `members` (
      `id` mediumint(8) NOT NULL default '0',
      `name` varchar(255) NOT NULL default '',
      `mgroup` smallint(3) NOT NULL default '0',
      `email` varchar(150) NOT NULL default '',
      `joined` int(10) NOT NULL default '0',
      `ip_address` varchar(16) NOT NULL default '',
      `posts` mediumint(7) default '0',
      `title` varchar(64) default NULL,
      `allow_admin_mails` tinyint(1) default NULL,
      `time_offset` varchar(10) default NULL,
      `hide_email` varchar(8) default NULL,
      `email_pm` tinyint(1) default NULL,
      `email_full` tinyint(1) default NULL,
      `skin` smallint(5) default NULL,
      `warn_level` int(10) default NULL,
      `warn_lastwarn` int(10) NOT NULL default '0',
      `language` varchar(32) default NULL,
      `last_post` int(10) default NULL,
      `restrict_post` varchar(100) NOT NULL default '0',
      `view_sigs` tinyint(1) default '1',
      `view_img` tinyint(1) default '1',
      `view_avs` tinyint(1) default '1',
      `view_pop` tinyint(1) default '1',
      `bday_day` int(2) default NULL,
      `bday_month` int(2) default NULL,
      `bday_year` int(4) default NULL,
      `new_msg` tinyint(2) default '0',
      `msg_total` smallint(5) default '0',
      `show_popup` tinyint(1) default NULL,
      `misc` varchar(128) default NULL,
      `last_visit` int(10) default '0',
      `last_activity` int(10) default '0',
      `dst_in_use` tinyint(1) default '0',
      `view_prefs` varchar(64) default '-1&-1',
      `coppa_user` tinyint(1) default '0',
      `mod_posts` varchar(100) NOT NULL default '0',
      `auto_track` varchar(50) default '0',
      `org_perm_id` varchar(255) default '',
      `temp_ban` varchar(100) default '0',
      `sub_end` int(10) NOT NULL default '0',
      `login_anonymous` char(3) NOT NULL default '0&0',
      `ignored_users` text,
      `mgroup_others` varchar(255) NOT NULL default '',
      `member_login_key` varchar(32) NOT NULL default '',
      `member_login_key_expire` int(10) NOT NULL default '0',
      `has_blog` tinyint(1) NOT NULL default '0',
      `subs_pkg_chosen` smallint(3) NOT NULL default '0',
      `members_auto_dst` tinyint(1) NOT NULL default '1',
      `members_cache` mediumtext,
      `members_disable_pm` int(1) NOT NULL default '0',
      `members_display_name` varchar(255) NOT NULL default '',
      `members_created_remote` tinyint(1) NOT NULL default '0',
      `members_editor_choice` char(3) NOT NULL default 'std',
      `members_markers` text,
      `members_profile_views` int(10) unsigned NOT NULL default '0',
      `members_l_display_name` varchar(255) NOT NULL default '0',
      `members_l_username` varchar(255) NOT NULL default '0',
      `failed_logins` text,
      `failed_login_count` smallint(3) NOT NULL default '0',
      `has_gallery` int(1) default '0',
      PRIMARY KEY  (`id`),
      KEY `mgroup` (`mgroup`),
      KEY `bday_day` (`bday_day`),
      KEY `bday_month` (`bday_month`),
      KEY `members_l_display_name` (`members_l_display_name`),
      KEY `members_l_username` (`members_l_username`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    pour la requete:


    si dans la table mgroup= 18 alors créer une entrée dans la table client et faire en sorte que name de la table members = s_client_name de la table clients

    i_client_id devra donc etre incrémenté tout seul
    i_client_server_id`devra avoir pour valeur 1,
    b_client_privilege_serveradmin -1
    s_client_name = name
    s_client_password devra avoir pour valeur toto
    dt_client_created date d'intégration du membre jjmmaaahhmmss
    dt_client_lastonline devra avoir pour valeur <null>


    J'espère que mon complément d'information saura vous éclairer

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Je comprends mieux la logique comme ça !

    Donc, si je suppose que tes bases s'appellent forum et serveurvocal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TRIGGER Members_AI AFTER INSERT ON forum.members
    AS
    INSERT INTO serveurvocal.clients (
      i_client_server_id, -- 1
      b_client_privilege_serveradmin, -- -1
      s_client_name,  -- mgroup
      s_client_password, -- toto
      dt_client_created -- now
    )
    VALUES (1, -1, 'mgroup', 'toto', date_format(now(), '%Y%m%d%H%i%s') 
    ) ;
    Mais attention, le trigger ne te permettra pas de récupérer ce qui s'est fait avant sa création.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut
    Ce me plait bien ca ^^ par contre de ce que je comprend avec mes maigres capacité c'est que si j'ajoute un membre dans la table forum ca va ajouter le membre dans la table serveurvocal, or le membre ne doit s'ajouter dans la table serveurvocal que si l'on place le membre de la table forum dans le group 18 (champs mgroup) et a ce moment il prend la valeur du champs name de la table forum pour le placer dans le champs s_client_name de la table serveur vocal

    si dans la table forum mgroup= 18 alors créer une entrée dans la table client et faire en sorte que name de la table members = s_client_name de la table clients
    Ansi sur mon forum quand je passe un membre du group 6 ou group 18 ca fait automatiquement l'insert dans la table serveurvocal en reprenant le champs name de la table forum pour le placer dans le champ s_client_name de la table serveur vocal


    Ca serai peut etre un truc dans ce gout la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE TRIGGER Members_AI AFTER INSERT ON forum.members
    "la faut mettre un truc pour dire que si mgroup=18 alors on fait la suite"
    AS
    INSERT INTO serveurvocal.clients (
      i_client_server_id, -- 1
      b_client_privilege_serveradmin, -- -1
      s_client_name,  -- name  
      s_client_password, -- toto
      dt_client_created -- now
    )
    VALUES (1, -1, name, 'toto', date_format(now(), '%Y%m%d%H%i%s') 
    ) ;
    j'ai corriger le s_client_name car j'avais indiqué que je voulais la valeure mgroup alors que je veux bien evidement la valeur du name ^^

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Citation Envoyé par Froufrou
    or le membre ne doit s'ajouter dans la table serveurvocal que si l'on place le membre de la table forum dans le group 18
    (...)
    j'ai corriger le s_client_name car j'avais indiqué que je voulais la valeure mgroup alors que je veux bien evidement la valeur du name ^^
    Ah oui, j'ai oublié l'histoire du groupe 18
    Avec la modif sur le name, ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TRIGGER Members_AI AFTER INSERT ON forum.members
    AS
    BEGIN
      IF new.mgroup = 18 THEN
        INSERT INTO serveurvocal.clients (
        i_client_server_id, -- 1
        b_client_privilege_serveradmin, -- -1
        s_client_name,  -- new.name
        s_client_password, -- toto
        dt_client_created -- now
        VALUES (1, -1, new.name, 'toto', date_format(now(), '%Y%m%d%H%i%s') );
      END IF ;
    END ;
    Citation Envoyé par Froufrou
    Ansi sur mon forum quand je passe un membre du group 6 ou group 18 ca fait automatiquement l'insert dans la table serveurvocal en reprenant le champs name de la table forum pour le placer dans le champ s_client_name de la table serveur vocal
    Non, car c'est un trigger AFTER INSERT. Il faudrait en faire un autre qui soit AFTER UPDATE.
    Ensuite, dans ta table serveurvocal.clients, il est possible que le client existe déjà. Il faudrait en fait utiliser REPLACE INTO à la place de INSERT INTO, ou bien INSERT INTO... ON DUPLICATE KEY UPDATE.

Discussions similaires

  1. Aide pour une requete, deux table, un champ commun.
    Par Space Cowboy dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/03/2007, 10h59
  2. aide pour une requete
    Par graphicsxp dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/03/2005, 15h02
  3. Aide pour une requete SQL
    Par hpghost dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 08/01/2005, 15h01
  4. Aide pour une requete SQL
    Par hpghost dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 08/01/2005, 10h15
  5. Aide pour une requete ... "COUNT(*)"
    Par mechantebestiole dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/05/2004, 16h27

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