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 table: sous requête UPDATE


Sujet :

Requêtes MySQL

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut Mise à jour table: sous requête UPDATE
    Bonjour,

    Je possède une table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE IF NOT EXISTS `final_trafic` (
      `site` varchar(11) DEFAULT NULL,
      `TYPE_SITE_THEORIQUE` varchar(11) DEFAULT NULL,
      `trafic_total` int(11) DEFAULT '0',
      `priorite_trafic` int(3) DEFAULT '0'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
    Actuellement j'utilise la requête1 pour remplir ma table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    -- requête1
    REPLACE INTO final_trafic
    SELECT sr.NUM_SITE_THEORIQUE2,  TYPE_SITE_THEORIQUE, SUM(sr.trafic) AS trafic_total, (UPDATE `final_trafic` SET priorite_trafic='4' WHERE PIC_TOT_TRAFIC_SEM<'153')  
    FROM
    (SELECT DISTINCT `SiteGeo_Equipement`, `trafic`, `image`, `NUM_SITE_THEORIQUE2`, `TYPE_SITE_THEORIQUE` FROM lister12 WHERE `trafic` IS NOT NULL) AS sr
    GROUP BY sr.NUM_SITE_THEORIQUE2
    cette requête ne me retourne aucun résultat!

    Comment puis-je intégrer les conditions suivante dans "requête1":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE final_trafic SET priorite_trafic='P1' WHERE trafic_total >=49830; 
    UPDATE final_trafic SET priorite_trafic='P2' WHERE trafic_total >=470 AND PIC_TOT_TRAFIC_SEM<49830;
    UPDATE final_trafic SET priorite_trafic='P3' WHERE trafic_total >=153 AND PIC_TOT_TRAFIC_SEM<470;
    UPDATE final_trafic SET priorite_trafic='P4' WHERE trafic_total <153;

    A titre d'exemple. Si j'ai l'enregistrement suivant dans la table `final_trafic`:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    `site` |`TYPE_SITE_THEORIQUE`|`trafic_total`|`priorite_trafic`
    (T10001|BTS                  |100           |P4
    P4 étant `priorite_trafic` et défini suivant les règles d'avant.

    Merci de votre aide.

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    je pense à quelque chose comme ça
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE final_trafic 
    CASE  WHEN trafic_total >=49830 THEN SET priorite_trafic='P1' 
    ELSE WHEN trafic_total >=470 AND PIC_TOT_TRAFIC_SEM<49830 THEN SET priorite_trafic='P2' 
    ELSE WHEN trafic_total >=153 AND PIC_TOT_TRAFIC_SEM<470 THEN SET priorite_trafic='P3'
    ELSE WHEN trafic_total <153 THEN SET priorite_trafic='P4'
    END;
    Je ne suis pas sûr de la syntaxe.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut
    J'ai essayé la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    REPLACE INTO final_trafic
    SELECT sr.NUM_SITE_THEORIQUE2,  TYPE_SITE_THEORIQUE, SUM(sr.trafic) AS trafic_total, 
    (UPDATE final_trafic 
    CASE  WHEN trafic_total >=49830 THEN SET priorite_trafic='P1' 
    ELSE WHEN trafic_total >=470 AND trafic_total <49830 THEN SET priorite_trafic='P2' 
    ELSE WHEN trafic_total >=153 AND trafic_total <470 THEN SET priorite_trafic='P3'
    ELSE WHEN trafic_total <153 THEN SET priorite_trafic='P4'
    END)  
    FROM
    (SELECT DISTINCT `SiteGeo_Equipement`, `trafic`, `image`, `NUM_SITE_THEORIQUE2`, `TYPE_SITE_THEORIQUE` FROM lister12 WHERE `trafic` IS NOT NULL) AS sr
    GROUP BY sr.NUM_SITE_THEORIQUE2
    L'erreur retournée est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1064 - Erreur de syntaxe près de 'UPDATE final_trafic CASE WHEN trafic_total >=49830 THEN SET priorite_trafic='' à la ligne 3
    J'ai vérifié la syntaxe sur http://dev.mysql.com/doc/refman/5.0/...statement.html
    Donc j'ai essayé avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    REPLACE INTO final_trafic
    SELECT sr.NUM_SITE_THEORIQUE2,  TYPE_SITE_THEORIQUE, SUM(sr.trafic) AS trafic_total, 
    (UPDATE final_trafic 
    CASE  WHEN trafic_total >=49830 THEN SET priorite_trafic='P1' 
    ELSE WHEN trafic_total >=470 AND trafic_total <49830 THEN SET priorite_trafic='P2' 
    ELSE WHEN trafic_total >=153 AND trafic_total <470 THEN SET priorite_trafic='P3'
    ELSE WHEN trafic_total <153 THEN SET priorite_trafic='P4'
    END CASE)  
    FROM
    (SELECT DISTINCT `SiteGeo_Equipement`, `trafic`, `image`, `NUM_SITE_THEORIQUE2`, `TYPE_SITE_THEORIQUE` FROM lister12 WHERE `trafic` IS NOT NULL) AS sr
    GROUP BY sr.NUM_SITE_THEORIQUE2
    Et ça ne marche toujours pas. merci.

    Cordialement.

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    De toutes façons, tu ne peux pas mélanger SELECT et UPDATE comme tu le fais.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    De toutes façons, tu ne peux pas mélanger SELECT et UPDATE comme tu le fais.
    Quelle serait alors la méthode pour mettre à jour le champ `priorite_trafic` suivant les conditions définies plus haut?

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par aiss57 Voir le message
    Quelle serait alors la méthode pour mettre à jour le champ `priorite_trafic` suivant les conditions définies plus haut?
    La requête UPDATE que je t'ai fournie, mais seule, hors de toute autre requête REPLACE ou SELECT
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Points : 49
    Points
    49
    Par défaut
    Dans ce cas je garde ma table ayant la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE IF NOT EXISTS `final_trafic` (
      `site` varchar(11) DEFAULT NULL,
      `TYPE_SITE_THEORIQUE` varchar(11) DEFAULT NULL,
      `trafic_total` int(11) DEFAULT '0',
      `priorite_trafic` int(3) DEFAULT '0'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
    Sauf que si j'exécute la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    REPLACE INTO final_trafic
    SELECT sr.NUM_SITE_THEORIQUE2,  TYPE_SITE_THEORIQUE, SUM(sr.trafic) AS trafic_total
    FROM
    (SELECT DISTINCT `SiteGeo_Equipement`, `trafic`, `image`, `NUM_SITE_THEORIQUE2`, `TYPE_SITE_THEORIQUE` FROM lister12 WHERE `trafic` IS NOT NULL) AS sr
    GROUP BY sr.NUM_SITE_THEORIQUE2
    L'erreur retournée est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1136 - Column count doesn't match value count at row 1
    C'est normal puisque je ne met pas à jour le champ `priorite_trafic`.
    Est ce qu'il y a une méthode pour éviter cette erreur?
    Sinon, j'ai pensé à remplir le champ `priorite_trafic` par une valeur bidon et ensuite mettre à jour ce même champ en exécutant la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE final_trafic 
    CASE  WHEN trafic_total >=49830 THEN SET priorite_trafic='P1' 
    ELSE WHEN trafic_total >=470 AND trafic_total <49830 THEN SET priorite_trafic='P2' 
    ELSE WHEN trafic_total >=153 AND trafic_total <470 THEN SET priorite_trafic='P3'
    ELSE WHEN trafic_total <153 THEN SET priorite_trafic='P4'
    END;

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Dans ta requête REPLACE mets NULL en lieu et place de la valeur pour la colonne `priorite_trafic`.
    Puis exécute la requête en UPDATE.

    J'aime mieux ne pas trop approfondir tout cela qui m'a l'air hyper mal conçu et redondant.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

Discussions similaires

  1. [MySQL] Erreur de mise à jour table sous mySql
    Par noubs dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/10/2014, 21h47
  2. Problème mise à jour table sous Acces
    Par colorid dans le forum Bases de données
    Réponses: 7
    Dernier message: 16/03/2012, 17h12
  3. Mise à jour table bloquante : Requête ne peut être MàJ
    Par rjl dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 31/07/2009, 21h58
  4. Mise à jour table à partir sous-formulaire
    Par Daniel MOREAU dans le forum Access
    Réponses: 6
    Dernier message: 19/05/2006, 09h26
  5. Mise à jour table liée à à sous formulaire
    Par Michel DELAVAL dans le forum Access
    Réponses: 1
    Dernier message: 15/04/2006, 16h26

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