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 :

effacer des lignes, lister les id, modifier autre chose


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2005
    Messages : 219
    Points : 174
    Points
    174
    Par défaut effacer des lignes, lister les id, modifier autre chose
    Bonjour,

    J'ai 2 tables myisam, en bref, une users, l'autre todo.
    Dans todo, des alertes (une ou +) pour certains users.
    Je souhaite effacer les lignes todo qui sont périmés de + de 30 jours. Et s'il n'y a alors plus de todo pour tel user, modifier un champ dans la table users pour indiquer qu'il n'a plus de todo en cours.

    En trois requêtes :
    - je liste les id des lignes qui dépassent à J+30 (WHERE TO_DAYS(NOW()) - TO_DAYS(crea) > 30)
    - j'efface ces lignes (DELETE avec un WHERE identique)
    - je change la valeur du champ de la table user s'il n'y a plus de lignes todo lui correspondant (un UPDATE avec un WHERE not in)

    C'est du bricolage à la hauteur de mon niveau en SQL
    J'ai bien vu qu'on ne pouvait pas lister des champs des lignes affectées par un DELETE.
    Donc est-ce que les 3 requêtes que je fais ci-dessus peuvent être simplifiées, allégées, bref réduites à une seule requête ? La vitesse n'étant pas un critère importante puisque cette requête est lancée 1 fois par jour pour quelques milliers de lignes.

    Merci.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 707
    Points
    23 707
    Par défaut
    Pour les 2 premières requêtes, elles peuvent être réunies en une seule (en mettant le WHERE dans le DELETE).
    Pour la seconde, elle peut être optimisée par la syntaxe décrite dans la à ce sujet : http://mysql.developpez.com/faq/?pag..._data_sans_ref

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2005
    Messages : 219
    Points : 174
    Points
    174
    Par défaut
    Merci.
    Tu veux dire le DELETE dans le WHERE ? Du style SELECT id FROM users WHERE (DELETE FROM users WHERE TO_DAYS(NOW()) - TO_DAYS(crea) > 30) ?

    Pour la troisième, pas de problème : une après l'autre, ces requêtes sont élémentaires. Mais c'est leur agrégation que je n'arrive pas à concevoir.

    edit : d'ailleurs DATEDIFF est plus simple.

  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 : 60
    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 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Non ! Il a dit WHERE dans le DELETE pour réunir les deux premières requêtes !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM todo
    WHERE DATEDIFF(CURRENT_DATE, crea) > 30
    Puis la requête UPDATE pour mettre à jour les users :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE users
    LEFT OUTER JOIN toto ON users.id = todo.user_id
    SET users.flag = 0
    WHERE todo.user_id IS NULL
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2005
    Messages : 219
    Points : 174
    Points
    174
    Par défaut
    Oui, ça ok, mais donc on ne peut pas réduire à une seule requête.

  6. #6
    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 : 60
    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 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Ben non ! DELETE et UPDATE sont deux opérations bien distinctes ! Surtout sur deux tables différentes !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/02/2007, 14h26
  2. [VBA_E]:copier des lignes d'une feuille à une autre
    Par VBBBA dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/06/2006, 16h42
  3. comment je peux effacer des lignes
    Par aliwassem dans le forum Composants VCL
    Réponses: 1
    Dernier message: 07/03/2006, 19h05
  4. Sauter des lignes dans les commentaires pour Javadoc ?
    Par Pépé Lélé dans le forum Langage
    Réponses: 2
    Dernier message: 08/12/2005, 17h43
  5. Probleme pour effacer des lignes
    Par Thargor dans le forum Oracle
    Réponses: 7
    Dernier message: 12/10/2005, 14h58

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