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 table avec condition [MySQL-5.5]


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 61
    Points : 52
    Points
    52
    Par défaut Update table avec condition
    Bonjour à tous,

    Je souhaite updater une table avec une condition sur la date.
    En gros, je voudrais lancer cette requête tous les pour actualiser les résultats de la veille. Donc en gros j'ai écris cette requête pour l'instant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE table1 SET volume=volume/100 WHERE table1.date=curdate()-1;
    Cependant, quand je souhaite faire cela le Lundi, il faut que ça prenne les données de vendredi et non dimanche ou samedi.
    Et également si possible quand il y a un jour férié. Par exemple, si Lundi est férié alors, le mardi, quand je lance la requête ça prenne automatiquement, la date de vendredi ...

    Pouvez vous m'aider ?
    Je vous en remercie par avance.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Le SGBD ne connait pas les jours fériés.
    Il vous faut une table pour les identifier. Quelques idées sur la question dans ce tutoriel.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Je m'interroge sur le but de cette opération, pourriez vous nous en dire plus.

    il serait surement préférable d'ajouter une colonne à votre table pour connaitre les lignes ayant déjà fait l'objet du traitement, en plus de résoudre votre problème de jour férié, ça vous permettrait une reprise plus facile en cas d’échec.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 61
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    Merci pour vos reponses.
    Je peux probablement les definir au prealable et actualiser cette liste une fois par an.
    Comme ca lorsque je rencontre l une de ces dates dans la clause Where alors, la date d'avant est prise en compte.

    Le but de cette operation est que je souhaite du jour precedent afin que lorsque mon script fait une recherche sur cette colonne, les plus petites valeurs sont prises en premier. Biensur dans le where j'ai une autre condition qui est id like '12000%' ce qui me permet d'afficher ces lignes en premier dans mon tableau.

    si vous avez des idees pour ameliorer mon system, je suis preneur

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 055
    Points
    19 055
    Par défaut
    Salut ca_adrien.

    En fait, ce que vous appelez veille, c'est ni plus ni moins qu'un jour ouvré.
    Les jours ouvrés sont inclus dans les jours ouvrables, qui sont inclus aussi dans les jours calendaires.
    Autrement dit, votre veille est un jour travaillé, non férié et non chômé.
    --> https://fr.wikipedia.org/wiki/Jour_ouvrable_en_France
    --> https://fr.wikipedia.org/wiki/Jour_ouvr%C3%A9

    Citation Envoyé par ca_adrien
    je voudrais lancer cette requête tous les jour pour actualiser les résultats de la veille.
    Je suppose que le mot manquant (celui que j'ai mis en rouge) est bien "jour".

    Comme j'ai un doute, devez-vous lancer tous les jours la requête ?
    Autrement dit, par tous les jours, dois-je comprendre les jours ouvrés ?

    Citation Envoyé par ca_adrien
    Je souhaite updater une table avec une condition sur la date.
    Quand je regarde votre requête, il y a quelque chose qui ne me convient pas du tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE table1 SET volume=volume/100 WHERE table1.date=curdate()-1;
    Si je comprends bien ce que vous essayez de faire, quand une journée est terminée, vous désirez diviser le volume par 100.
    Et si vous lancez deux fois de suite la requête, le volume sera encore divisé par 100.

    Afin de garantir le succès de cette requête, il manque quelque chose qui indiquera que la ligne a déjà été traité ou pas.
    C'est une sécurité qui empêche de traiter deux fois la même ligne.

    Citation Envoyé par ca_adrien
    Cependant, quand je souhaite faire cela le Lundi, il faut que ça prenne les données de vendredi et non dimanche ou samedi.
    Je ne comprends pas bien ce que vous essayez d'expliquer.

    Soit la journée du vendredi.
    Nous sommes le samedi, donc vous allez traiter par votre requête la veille, c'est-à-dire la journée du vendredi.
    Nous sommes maintenant le dimanche. Désirez-vous encore traiter le vendredi ?
    Nous sommes le lundi, et ce jour est férié ? Que dois-je comprendre ? Qe vous allez encore traiter le vendredi ?
    Nous sommes le mardi. Allez-vous encore traiter le vendredi ?

    Je pense que pour résoudre votre problème, en tenant compte que la requête ne doit pas s'exécuter deux fois de suite, même à des jours différents, vous devez ajouter une colonne de nom "traité", qui va prendre deux valeurs possibles :
    --> soit la valeur 'N', ce qui signifie que le volume n'a pas encore été traité.
    --> soit la valeur 'O', qui qui signifie que la ligne a déjà été traité.

    Ensuite, il vous faut une date. D'ailleurs, c'est le cas dans votre requête. Comment gérer cela ?
    Il vous faut au préalable, avoir quelque part dans votre base de données, la date de la dernière exécution (lastexec) de votre requête.

    En fait, cela me rappelle les traitement à la demande.
    On crée une table contenant une demande d'exécution, par exemple, contenant la date d'exécution et le traitement à faire.
    Il y a bien sûr un flag qui sera mis à 'N', pour dire qu'elle n'a pas encore été exécuté.
    Disons que le lancement du traitement à la demande se fasse tous les soirs, après minuit.
    Si la demande est renseignée dans la table des demandes, alors vous lancer le traiterment à la condition que le flag soit à 'N'.
    Si le traitemebnt s'est bien terminé, à la finde celui-ci, on passe le flag à 'O'.
    Si le traitement plante, le flag reste à 'N', signifiant qu'il y a eu un problème.

    Reprenons la journée du vendredi.
    Comme je le suppose, le samedi, le dimanche et le lundi qui est un jour férié, la requête n'a pas été exécutée.
    Mais la dernière exécution s'est faire le vendredi pour traiter la veille, c'est-à-dire le jeudi, qui n'est pas férié.

    La date de votre table doit être testée dans un intervalle compris entre la dernière exécution (ici le vendredi) et aujourd'hui (qui est le mardi).

    Je récapitule :
    1) diviser par 100 le volume.
    2) le faire que si la colonne traite est à 'N'. On met 'o' si on divise par 100 le volume.
    3) tester la date dans l'intervalle dernière exécution et aujourd'hui.

    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE table1 SET volume=volume/100, traite='O' WHERE traite='N' and `date` >= table25.lastexec and `date` <= now();
    Si cette solution ne vous convient pas, il faudra gérer un calendrier des jours ouvrés dans votre entreprise.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Mais que représente donc cette colonne volume ?

    Vous en changez le contenu juste pour modifier le classement dans le résultat d'une requete ?

    Pourquoi ne pas simplement adapter votre clause ORDER BY pour prendre en compte cette spécificité ? (voire traiter ce cas dans votre code applicatif !)


    Enfin, vous mélangez des nombres et des chaines de caractères, en faisant des divisions, mais également des LIKE sur cette colonne... si tant est que cela fonctionne comme vous le souhaitez, ça risque de nuire aux performances.

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 055
    Points
    19 055
    Par défaut
    Salut aieeeuuuuu.

    Merci pour le -1.

    Citation Envoyé par aieeeuuuuu
    Vous en changez le contenu juste pour modifier le classement dans le résultat d'une requête ?
    Voici l'explication donné par ca_adrien :

    Citation Envoyé par ca_adrien
    lorsque mon script fait une recherche sur cette colonne, les plus petites valeurs sont prises en premier.
    donc oui, comme façon de faire, ce n'est pas très propre.
    Sans explication de sa part, il est difficile de trouver une solution performante.

    Citation Envoyé par ca_adrien
    Bien sûr dans le where j'ai une autre condition qui est id like '12000%' ce qui me permet d'afficher ces lignes en premier dans mon tableau.
    Je ne l'avais pas vu ! C'est quoi ça ? Faire un like sur une colonne 'id'.
    En principe, la colonne 'id ' est de type integer et auto_increment.

    Il serait bon de nous donner le descriptif de la table et ce que vous essayez tant bien que mal de faire.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2013
    Messages : 61
    Points : 52
    Points
    52
    Par défaut
    Merci à tous pour vos réponses. Bon j'ai pu finalement résoudre mon problème encore plus simplement en prenant la dernière date à laquelle les données ont étés insérées dans la table.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Update sur une table avec conditions
    Par tibss dans le forum Langage SQL
    Réponses: 8
    Dernier message: 08/07/2011, 17h13
  2. [AC-2007] Update table avec condition
    Par souketou dans le forum VBA Access
    Réponses: 4
    Dernier message: 22/04/2009, 16h43
  3. [MySQL] incrementation de table avec condition
    Par urbalk dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/12/2006, 21h36
  4. Réponses: 12
    Dernier message: 12/06/2006, 14h29
  5. Sélection multi table avec condition
    Par iuz dans le forum Langage SQL
    Réponses: 8
    Dernier message: 05/05/2004, 15h04

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