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 :

Mise à jour a partir d'un autre champs


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Points : 161
    Points
    161
    Par défaut Mise à jour a partir d'un autre champs
    Bonjour,

    Voilà j'ai une base de données Mysql administré par phpmyadmin sur un serveur Xampp V 1.7.1.

    J'ai une table nommé "res_x" qui contient en fait plein d'info, logique jusque la, donc l'id, le nom, le numéro d'archive, la date, ... .

    Mon problème est que je dois mettre a jours TOUTES les informations de cette table (il y en a plus de 5000) suivant 1 seule logique, Le numéro d'archive. Et je n'ai pas droit à l'erreur car cette une base de donnée utilisé ici à mon boulot et qui a une haute importance.

    Le format du champs " numéro d'archive" est du type A1234/4567/89.
    A= identique à tous, et est la pour dire que c'est une Archive.
    1234= code de rue, j'aurais normalement un fichier excell avec 1 le code, et 2 le nom de la rue.
    4567= le numéro de la rue.
    89= le numéro du dossier concernant le numéro 4567 de la rue 1234

    et je dois donc faire en sorte que le champs X de cette table obtient le nom de la rue suivant donc le code 1234,
    et un autre champs doit obtenir le numéro de la rue suivant le code 4567.

    Est ce que c'est possible de faire?

    Merci d'avance pour l'aide que vous me fournirez.

    Isarian

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Le format du champs " numéro d'archive" est du type A1234/4567/89.
    A= identique à tous, et est la pour dire que c'est une Archive.
    1234= code de rue, j'aurais normalement un fichier excell avec 1 le code, et 2 le nom de la rue.
    4567= le numéro de la rue.
    89= le numéro du dossier concernant le numéro 4567 de la rue 1234
    Cette base de données n'est donc pas normalisée puisque cette colonne contient plusieurs données de nature différente !
    A moins qu'il s'agisse d'une référence d'archive construite à partir d'informations provenant d'autres tables qui sont, elles, normalisées ?

    et je dois donc faire en sorte que le champs X de cette table obtient le nom de la rue suivant donc le code 1234,
    et un autre champs doit obtenir le numéro de la rue suivant le code 4567.
    Là j'ai du mal à comprendre...
    Tu souhaites que la colonne X reçoive le nom de la rue correspondant au numéro de la rue figurant dans le code de l'archive ?
    Et qu'une autre colonne (et pas champ !) reçoive le numéro de la rue correspondant au code inclus dans le code de l'archive ?

    Si, comme il se devrait, ces codes sont des identifiants faisant référence à d'autres tables, ils ne devraient jamais changer : une rue portant le code 1234 gardera à vie le code 1234 et ce code ne sera jamais employé pour une autre rue, même si la rue est supprimée.

    Dès lors, la table res_x devrait avoir des clés étrangères faisant référence à ces tables, et donc autant de colonnes qu'il y a de clés étrangères à référencer.
    Par conséquent, l'opération qui consiste à ajouter dans cette table le nom de la rue correspondant à son code est une dénormalisation supplémentaire de la BDD donc une mauvaise idée qui peut entraîner des incohérences de données.

    Explique nous plus en détail et plus concrêtement (sans X) le besoin et indique la latitude dont tu disposes pour modifier la structure de la BDD. Nous t'aiderons à trouver la meilleure solution.

  3. #3
    Membre habitué Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Points : 161
    Points
    161
    Par défaut
    En fait voilà, cette base de données sert à l'achivage des données urbanistique.
    L'application qui gere cette base ne va être utilisé que pour les personnes extérieur à la société.
    Le code rue est en unique pour chaque rue en effet. Et ne changera pas. Malheureusement le listing code rue se trouve hors du programme. J'ai la possibilité de l'avoir en fichier excel.

    En fait je dois avoir une mise à jours de 2 champs (qui sont null actuellement) et qui doivent avoir le nom de la rue et le numéro de la maison.
    Pour avoir facile j'ai pensé au champs de cette même table qui contient les informations nécessaire, à savoir le code, et le numéro.

    A la limite, je peux faire quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Update tableresx set champsrue= nomdelarue where resx.champsarchive= 1234
    en gros je donne moi même le nom de la rue suivant le code, si cela peut aider.

    Il ya donc beaucoup de fichiers mais peut de rue utilisé en fait.

    Pour ce que je peux faire:

    Je ne peux en aucun cas risqué la perte ou la modification des données existante.
    Je peux pas changer la structure des champs/ tables. Je peux par contre rajouter des tables.

    Je pense que c'est déjà un peu plus clair maintenant

    Merci

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par isarian Voir le message
    En fait voilà, cette base de données sert à l'achivage des données urbanistique.
    Cette base est normalisée et contient la table des rues ?

    L'application qui gere cette base ne va être utilisé que pour les personnes extérieur à la société.
    Le code rue est en unique pour chaque rue en effet. Et ne changera pas. Malheureusement le listing code rue se trouve hors du programme.
    'Programme' = l'application citée deux phrases plus haut ? L'application est figée ou en développement ?
    'Listing' = table des rues ? disponible dans une autre BDD inaccessible par le programme ?

    J'ai la possibilité de l'avoir en fichier excel.
    Avoir le listing de rues avec leur identifiant ?

    Je peux par contre rajouter des tables.
    Donc créer une table des rues à partir du listing Excel dans la BDD accessible à l'application ?

    En fait je dois avoir une mise à jours de 2 champs (qui sont null actuellement) et qui doivent avoir le nom de la rue et le numéro de la maison.
    Pour avoir facile j'ai pensé au champ de cette même table qui contient les informations nécessaires, à savoir le code, et le numéro.

    A la limite, je peux faire quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Update tableresx set champsrue= nomdelarue where resx.champsarchive= 1234
    Sauf que ta colonne (et pas champ !) nommée 'champsarchive' n'est jamais égale à 1234 puisqu'elle commence par un A.

    Il y a donc beaucoup de fichiers mais peu de rues utilisées en fait.
    Euh... quels 'fichiers' ?
    'Peu de rue' ? Tu veux dire que le code archive contenant le code de la rue n'est pas renseigné sur beaucoup de lignes de la table ?

    Je ne peux en aucun cas risquer la perte ou la modification des données existantes.
    Alors commence par agir sur une nouvelle table pour vérifier que ça fonctionne.

    Il faut décomposer la colonne 'champsarchive' pour en extraire les informations.

    Procédons par étape...
    1) Quelle est la position du premier slash ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT champsarchive, INSTR(champsarchive, '/') AS position_premier_slash
    FROM tableresx
    2) Ne garder que ce qu'il y a entre le A et le premier slash ==> le code de la rue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT champsarchive,
      SUBSTRING(champsarchive, 2, INSTR(champsarchive, '/') - 1) AS code_rue
    FROM tableresx
    3) Ne garder que ce qui suit le premier slash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT champsarchive, 
      RIGHT(champsarchive, LEN(champsarchive) - INSTR(champsarchive, '/')) AS apres_premier_slash
    FROM tableresx
    4) Quelle est la position du second slash ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT champsarchive, 
      INSTR(RIGHT(champsarchive, LEN(champsarchive) - INSTR(champsarchive, '/')), '/') AS position_second_slash
    FROM tableresx
    5) Ne garder que ce qu'il y a entre les deux slashes ==> le numéro dans la rue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT champsarchive, 
      LEFT(RIGHT(champsarchive, LEN(champsarchive) - INSTR(champsarchive, '/')), INSTR(RIGHT(champsarchive, LEN(champsarchive) - INSTR(champsarchive, '/')), '/')) AS numero_dans_rue
    FROM tableresx
    6) Les deux dans la même requête et en insérant dans une nouvelle table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO new_table
    SELECT champsarchive,
      SUBSTRING(champsarchive, 2, INSTR(champsarchive, '/') - 1) AS code_rue
      LEFT(RIGHT(champsarchive, LEN(champsarchive) - INSTR(champsarchive, '/')), INSTR(RIGHT(champsarchive, LEN(champsarchive) - INSTR(champsarchive, '/')), '/')) AS numero_dans_rue
    FROM tableresx
    A essayer.

  5. #5
    Membre habitué Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Cette base est normalisée et contient la table des rues ?
    Non elle ne contient pas de table avec le lien nomrue et coderue

    Citation Envoyé par CinePhil Voir le message
    'Programme' = l'application citée deux phrases plus haut ? L'application est figée ou en développement ?
    'Listing' = table des rues ? Disponible dans une autre BDD inaccessible par le programme ?
    L'application n'est plus en développement et reste figé.
    Le listing table des rues se trouve dans une autre application mais Aucun lien possible entre les 2 applications.


    Citation Envoyé par CinePhil Voir le message
    Avoir le listing de rues avec leur identifiant ?
    Oui je peux avoir un fichier contenant le lien entre le nom et le code rue.


    Citation Envoyé par CinePhil Voir le message
    Donc créer une table des rues à partir du listing Excel dans la BDD accessible à l'application ?
    Oui je peux créer une nouvelle table avec les informations nécessaire.

    Citation Envoyé par CinePhil Voir le message
    Euh... quels 'fichiers' ?
    'Peu de rue' ? Tu veux dire que le code archive contenant le code de la rue n'est pas renseigné sur beaucoup de lignes de la table ?
    Fichiers = éléments de la table.
    "peu de rue"= ce programme sert donc d'archivage numérique de tous les dossiers urbanistiques. Et donc on a commencé l'encodage à partir de la première rue de la commune. Et qui commence par la lettre A donc. Et actuellement on est arrivé seulement aux rues commençant par la lettre B.


    Le premier / se trouvera toujours en 6 ieme position (A1234/)
    Pour le 2 ieme se sera plus difficile vu qu'il peut varier.

    Je regarde ce que tu as mis pour voir comment mettre en place.

    Merci

  6. #6
    Membre habitué Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Points : 161
    Points
    161
    Par défaut
    Bonjour, j'ai essayé les différentes étapes que tu proposes, je suis arrivé à la 3 ieme où j'obtiens l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    requête SQL:  
     
    SELECT custom_t5, RIGHT( custom_t5, LEN(
     
    custom_t5
    ) - INSTR( custom_t5, '/' ) ) AS apres_premier_slash
    FROM res_x
    LIMIT 0 , 30 
     
    MySQL a répondu: 
     
    #1305 - FUNCTION test.LEN does not exist
    Par contre, j'aurais une petite question pour la première etape, j'obtiens quelque 5 et le reste des 6. Est ce que cela poserais des problèmes par la suite?

    Merci

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Une souvenir de mes premier pas de programmation en Basic...
    En SQL, ce n'est pas LEN mais LENGTH.

    Voir les fonctions de chaînes de caractères dans la doc MySQL.

  8. #8
    Membre habitué Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Points : 161
    Points
    161
    Par défaut
    Merci,

    Avec ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT `custom_t5` , LEFT( RIGHT( `custom_t5` , LENGTH( `custom_t5` ) - INSTR( `custom_t5` , '/' ) ) , INSTR( RIGHT( `custom_t5` , LENGTH( `custom_t5` ) - INSTR( `custom_t5` , '/' ) ) , '/' ) ) AS numero_dans_rue
    FROM res_x
    il prend bien le numéro mais il y a toujours le /.

    Une idée pour changé cela?

    Pour la dernière étape j'obtiens une autre erreur, .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    requête SQL:  
     
    INSERT INTO test_import
    SELECT `custom_t5` , SUBSTRING( `custom_t5` , 2, INSTR( `custom_t5` , '/' ) -1 ) AS code_rueLEFT( RIGHT( `custom_t5` , LENGTH( `custom_t5` ) - INSTR( `custom_t5` , '/' ) ) , INSTR( RIGHT( `custom_t5` , LENGTH( `custom_t5` ) - INSTR( `custom_t5` , '/' ) ) , '/' ) ) AS numero_dans_rue
    FROM res_x 
     
    MySQL a répondu: 
     
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT(RIGHT(`custom_t5`, LENGTH(`custom_t5`) - INSTR(`custom_t5`, '/')), INSTR(RI' at line 4
    une raison?

    Encore merci

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par isarian Voir le message
    Avec ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT `custom_t5` , LEFT( RIGHT( `custom_t5` , LENGTH( `custom_t5` ) - INSTR( `custom_t5` , '/' ) ) , INSTR( RIGHT( `custom_t5` , LENGTH( `custom_t5` ) - INSTR( `custom_t5` , '/' ) ) , '/' ) ) AS numero_dans_rue
    FROM res_x
    il prend bien le numéro mais il y a toujours le /.

    Une idée pour changé cela?
    Faut chercher un peu quand même !
    Il doit falloir ajouter ou retirer 1 dans la formule.
    Je t'ai donné la piste à suivre, à toi de faire la route.

    Pour la dernière étape j'obtiens une autre erreur, .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    requête SQL:  
     
    INSERT INTO test_import
    SELECT `custom_t5` , SUBSTRING( `custom_t5` , 2, INSTR( `custom_t5` , '/' ) -1 ) AS code_rueLEFT( RIGHT( `custom_t5` , LENGTH( `custom_t5` ) - INSTR( `custom_t5` , '/' ) ) , INSTR( RIGHT( `custom_t5` , LENGTH( `custom_t5` ) - INSTR( `custom_t5` , '/' ) ) , '/' ) ) AS numero_dans_rue
    FROM res_x 
     
    MySQL a répondu: 
     
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT(RIGHT(`custom_t5`, LENGTH(`custom_t5`) - INSTR(`custom_t5`, '/')), INSTR(RI' at line 4
    une raison?
    Là c'est pas dur non plus à trouver !
    Le message t'indique que l'erreur se trouve juste avant 'LEFT(RIGHT...)'.
    Il n'y a pas quelque chose qui te choque ?

  10. #10
    Membre habitué Avatar de isarian
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 268
    Points : 161
    Points
    161
    Par défaut


    Je voulais tellement chercher la petite bête que j'ai même pas regarder

    Même en voyant les couleurs du forum, je vois le soucis :'(

    Honte à moi

    merci

Discussions similaires

  1. mise à jour table à partir d'une autre table
    Par k_boy dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 13/09/2010, 21h37
  2. Mise à jour table à partir sous-formulaire
    Par Daniel MOREAU dans le forum Access
    Réponses: 6
    Dernier message: 19/05/2006, 09h26
  3. Mise à jour a partir d'un autre formulaire
    Par xboulney dans le forum Access
    Réponses: 8
    Dernier message: 28/02/2006, 21h55
  4. Mise à jour Pro à partir de licence Etudiant ?
    Par Neilos dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/11/2005, 16h03
  5. Réponses: 17
    Dernier message: 15/10/2003, 01h45

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