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

Langage SQL Discussion :

Besoin d'aide calcul de champs


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Besoin d'aide calcul de champs
    Bonjour à tous,

    Avant de poser une question plus "technique" sur la mise en place d'un code PHP pour la mise à jour de données dans un champ, je souhaite votre avis sur la conception même de ce que je souhaite faire.

    Pour bien comprendre, j'utilise un logiciel qui stocke des données dans une base mysql, j'exploite cette base mais je dois ajouter un nouveau champ et l'alimenter en fonction des données déjà présente !

    la table prend cette forme

    id_quest | id_comp | quest_name | id_quest_parent | quest_parent_name

    Les valeurs des 4 premiers champs sont alimentés par le soft mais je souhaite alimenter la dernière moi-même (via un script php je pense) en fonction des valeurs précédentes.

    pour chaque id_quest qui est la clé primaire :

    Si id_quest_parent = 0 alors quest_parent_name = quest_name
    Si id_quest_parent <> 0 alors quest_parent_name = (select quest_name where id_quest_parent = id_quest)

    J'espere avoir été clair...

    Merci à vous de m'avoir lu.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    faites une requête update.

    Pas besoin de script php pour ça.

    Essayez de faire le select qui ramenera les bonnes données on verra l'update ensuite.

    Vous aurez besoin de :
    - jointure externe (LEFT OUTER JOIN)
    - COALESCE (pour gérer la bonne valeur à récupérer)

  3. #3
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Les valeurs des 4 premiers champs sont alimentés par le soft mais je souhaite alimenter la dernière moi-même (via un script php je pense) en fonction des valeurs précédentes.
    Pourquoi en PHP ?
    Une simple requête SQL te permet d'initialiser ta zone sans difficulté

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 82
    Points : 140
    Points
    140
    Par défaut
    Salut bouligoulag,

    Si je peux me permettre, je pense que ce serait une erreur de rajouter cet attribut (quest_parent_name). Cet attribut devra être maintenu en permanence. La seule raison que je vois justifiant cette colonne serait pour des questions de performances, mais avant de prendre cette décision, tu devrais peut-être vérifier que tu n'as pas d'autres choix.

    J'ai fais un rapide petit test avec Oracle...

    Données de test:
    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
     
    DROP TABLE bouligoulag;
    CREATE TABLE bouligoulag
    (
    id_quest NUMBER(10),  -- assumons PK
    id_comp NUMBER(10), 
    quest_name VARCHAR2(100), 
    id_quest_parent NUMBER(10), -- assumons FK vers la meme table
    quest_parent_name VARCHAR2(100) -- ne devrait pas être rajouter car crée de la redondance!!! 
    );
     
    INSERT INTO bouligoulag VALUES(1, NULL, 'Root', NULL, NULL);
    INSERT INTO bouligoulag VALUES(2, NULL, 'Enfant 1', 1, NULL);
    INSERT INTO bouligoulag VALUES(3, NULL, 'Enfant 2', 1, NULL);
    INSERT INTO bouligoulag VALUES(30, NULL, 'Enfant 21', 3, NULL);
    INSERT INTO bouligoulag VALUES(4, NULL, 'Enfant 3', 1, NULL);
    Avec une simple requête, tu peux récupérer le nom du "noeud" parent comme ceci:
    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
     
    COLUMN QUEST_NAME FORMAT A10;
    COLUMN T1 FORMAT A10;
    SELECT b1.id_quest, 
           b1.quest_name, 
           b1.id_quest_parent, 
           CASE 
             WHEN LEVEL = 1 THEN NULL 
             ELSE regexp_substr(SYS_CONNECT_BY_PATH(quest_name, '#'), '[^#]+', 1, LEVEL-1, 'i') 
           END as t1
      FROM bouligoulag b1
     START WITH b1.id_quest_parent IS NULL
    CONNECT BY b1.id_quest_parent = PRIOR b1.id_quest;
     
      ID_QUEST QUEST_NAME ID_QUEST_PARENT T1       
    ---------- ---------- --------------- ----------
             1 Root       (null)          (null)     
             2 Enfant 1                 1 Root       
             3 Enfant 2                 1 Root       
            30 Enfant 21                3 Enfant 2   
             4 Enfant 3                 1 Root
    Ceci est une requête spécifique à Oracle (version > 10 vu l'utilisation de regexp_substr). Mais d'après mes vieux souvenirs, MySQL supporte également les requêtes hierarchiques et les expressions régulières. Je ne pense pas que tu auras beaucoup de mal à adapter cette requête vu sa simplicité.

    Par contre, si tu t'entêtes à vouloir ajouter ce champ, la requête suivante te permettra de faire la mise à jour.

    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
     
    UPDATE bouligoulag b1
       SET b1.quest_parent_name = (SELECT b2.quest_name 
                                     FROM bouligoulag b2 
                                    WHERE b1.id_quest_parent = b2.id_quest
                                  );
     
    5 rows updated.
     
    COLUMN QUEST_PARENT_NAME FORMAT A20;
    SELECT * FROM bouligoulag;
     
      ID_QUEST    ID_COMP QUEST_NAME ID_QUEST_PARENT QUEST_PARENT_NAME  
    ---------- ---------- ---------- --------------- --------------------
             1 (null)     Root       (null)          (null)               
             2 (null)     Enfant 1                 1 Root                 
             3 (null)     Enfant 2                 1 Root                 
            30 (null)     Enfant 21                3 Enfant 2             
             4 (null)     Enfant 3                 1 Root
    Peut être aussi serait-il judicieux de ne pas mettre à jour tout les enregistrements à chaque mise à jour. Dans ce cas, tu devrais nous expliquer un peu comment ton processus fonctionne.

    Si tu as d'autres questions, aussi bien par rapport à ma remarque sur la pertinence de ce champs ou pour une requête SQL, n'hésite pas à le faire savoir.

Discussions similaires

  1. besoin d'aide calcul de date
    Par Missteigne dans le forum Access
    Réponses: 15
    Dernier message: 06/11/2010, 20h12
  2. Réponses: 1
    Dernier message: 28/02/2008, 22h40
  3. [OpenOffice][Tableur] Besoin d'aide Feuille de calcul
    Par shido dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 18/03/2007, 17h36
  4. Besoin d'aide pour un calcul sur un site
    Par barre dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/02/2007, 09h36
  5. champ text et insert : besoin d'aide
    Par Pm dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 23/08/2005, 15h10

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