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 :

update mysql conditionnel


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 104
    Par défaut update mysql conditionnel
    Bonjour,

    Je souhaiterai effectuer un update conditionnel en un minimum de requetes.

    Dans le champs member_note_ev, les valeurs autorisées sont de 0 à 100.
    En aucun cas, je ne veux dans mes update que le champs member_note_ev soit inférieur à 0.

    Comment simplifier et imbriquer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mysql_query("UPDATE members SET member_note_ev = member_note_ev - 20 WHERE member_login = '$member_login' AND member_note_ev > 10");
     
    mysql_query("UPDATE members SET member_note_ev = member_note_ev - 10 WHERE member_login = '$member_login' AND member_note_ev >= 10");
    Faire en sorte que si la 1ère requete n'est pas valide, exécuter la deuxième ?

    Merci.

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 104
    Par défaut
    Personne n'aurait une idée à tout hasard, sans faire de requete supplémentaire pour aller vérifier la valeur du champs member_note_ev avant de faire l'update ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Par défaut
    Bonjour

    Je ne vois pas trop ce que tu veux faire mais tu peux rajouter un CHECK (member_note_ev >= 0) sur la structure de ta table.
    Cette verification fera echouer ta requète si la condition n'est pas respectée et tu obtiendra donc false avec ton mysql_query php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $res = mysql_query("UPDATE members SET member_note_ev = member_note_ev - 20 WHERE member_login = '$member_login' AND member_note_ev > 10");
    if(!$res) 
    mysql_query("UPDATE members SET member_note_ev = member_note_ev - 10 WHERE member_login = '$member_login' AND member_note_ev >= 10");
    Bon après je n'ai pas compris ce que tu veux réellement faire donc..

    +

  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 : 73
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par iGwendal Voir le message
    Je ne vois pas trop ce que tu veux faire mais tu peux rajouter un CHECK (member_note_ev >= 0) sur la structure de ta table.
    Cette verification fera echouer ta requète si la condition n'est pas respectée et tu obtiendra donc false avec ton mysql_query php :
    Sauf, qu'à ma connaissance MySQL accepte la syntaxe de déclaration des contraintes CHECK, mais les ignore royalement à l'exécution.
    Je pense qu'il faut plutôt passer par une structure CASE pour le SET
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Erreur de frappe ?

    Ton besoin :
    En aucun cas, je ne veux dans mes update que le champs member_note_ev soit inférieur à 0
    Extrait de la première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET member_note_ev = member_note_ev - 20 
    WHERE member_note_ev > 10
    Si member_note_ev vaut 11 et que je retire 19, à ton avis il se passe quoi ?

    Comme suggéré par Maljuna_Kris, tu peux essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE members
    CASE 
      WHEN member_note_ev > 19 THEN SET member_note_ev = member_note_ev - 20
      ELSE SET member_note_ev = member_note_ev - 10
    END
    WHERE member_note_ev > 9
    Pas sûr de l'emplacement du SET et du CASE. Il faudra peut-être chercher la syntaxe exacte mais c'est l'idée.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 104
    Par défaut
    Ok je vais essayer les différentes pistes et je vous tiens informé.

    Non pour l'erreur de frappe il n'y en à pas, peut-être un oubli de ma part en effet : le champs member_note_ev est un entier de 0 à 100 dont les opérations faites dessus sont uniquement par valeurs de 10 en 10, donc member_note_ev ne pourra pas être égal à 11. 10 ou 20 au pire.

    Je fais les essais merci.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Pas sûr de l'emplacement du SET et du CASE. Il faudra peut-être chercher la syntaxe exacte mais c'est l'idée.
    Effectivement il faut les intervertir.
    Avec les nouvelles informations vous pouvez écrire votre update ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE members
      SET member_note_ev = CASE member_note_ev
                             WHEN 10 THEN 0
                             ELSE member_note_ev - 20
                           END
     WHERE member_note_ev >= 10
       AND member_login = '$member_login';

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/02/2008, 13h23
  2. Mysql-Replication et UPDATE / Mysql-Cluster et Lock
    Par X_Cli dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/01/2008, 20h00
  3. Update mysql impossible
    Par mdackhe dans le forum Requêtes
    Réponses: 1
    Dernier message: 21/04/2007, 14h40
  4. Réponses: 1
    Dernier message: 04/04/2007, 11h03
  5. problème d'update MYSQL
    Par pas30 dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/01/2007, 19h18

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