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 date_creation d'un enregistrement en fonction de l'id le plus proche [MySQL-5.5]


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 120
    Points : 62
    Points
    62
    Par défaut UPDATE date_creation d'un enregistrement en fonction de l'id le plus proche
    Bonjour,

    J'ai une grosse problématique que je n'arrive pas à résoudre depuis 2 jours.
    Je ne sais pas si mon libellé est clair mais j'explique :
    j'ai une table "evt" avec différentes colonnes dont evt_id (pour la clé primaire) et date_creation.
    Le champ date_creation n'a pas été créé à la création de la table.
    De ce fait, j'ai mis à jour ce champ en fonction d'autres champs date contenu dans ma table.
    Sur 1 millions de lignes, il me reste aujourd'hui 24 000 date_creation qui sont nulles et que je ne peux pas déterminer.

    J'aimerais finalement mettre à jour ces date_creation vides par le biais des autres enregistrements de ma table par rapport l'id supérieur le plus proche.

    Voici ma requête sélect :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT evt_id,
    (SELECT date_creation FROM evt AS tmp1 WHERE tmp1.evt_id > evt.evt_id AND tmp1.date_creation IS NOT NULL ORDER BY tmp1.evt_id LIMIT 1) date_creation,
    (SELECT evt_id FROM evt AS tmp2 WHERE tmp2.evt_id > evt.evt_id AND tmp2.date_creation IS NOT NULL ORDER BY tmp2.evt_id LIMIT 1) info 
    FROM evt 
    WHERE date_creation IS NULL 
    LIMIT 0,10;
    Cette requête me renvoi l'id à mettre à jour, la date_creation, et l'id supérieur le plus proche de mon id de départ.
    Elle fonctionne bien avec ma limite de 10 enregistrements, mais si je n'en met aucune, ça mouline et je ne récupère aucun résultat.
    Déjà, je n'ai pas pu écrire de requête UPDATE à partir de mon SELECT, je n'ai trouvé aucune solution.
    J'avais décidé d'exporter les résultats de mon SELECT dans un fichier CSV et ensuite de construire, à la main (oui je sais...) mes requêtes d'UPDATE.
    Mais je me retrouve une nouvelle fois bloquée par cette limitation.

    Pour info, j'ai rajouté des index sur date_creation, puis sur evt_id et date_creation.
    J'ai également tenté en ligne de commande.
    Tout ça n'a rien donné.

    Si vous avez des solutions à me proposer, je suis toute ouïe.

    Merci d'avance et bon week end !
    "Les tests sont au développement ce que le fromage est à la fondue"

  2. #2
    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 388
    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 388
    Points : 19 106
    Points
    19 106
    Par défaut
    Salut Gazelle.

    J'ai repris ton select et je l'ai décomposer en deux phases que voici :

    1) recherche de la valeur du evt_id, juste supérieure à la ligne courante avec une date de création différente de NULL.
    Ce résultat sera stocké dans la colonne 'info' pour un evt_id donné dont la date de création est NULL.

    Je suis passé par une autre table, pour stocker ce résultat.
    La table n'est ni en MyIsam, ni InnoDB, mais en Memory car c'est plus rapide. Sinon cette phase est assez longue.

    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
    create table `toto`
    (
      `evt_id`         int    NOT NULL,
      `info`           int    NOT NULL,
      `date_creation`  date   NULL,
      PRIMARY KEY (`evt_id`),
      INDEX index1 (info),
      INDEX index2 (date_creation)
    ) ENGINE=memory
      DEFAULT CHARSET=`utf8` COLLATE=`utf8_general_ci`
      ROW_FORMAT=COMPRESSED
     
    select   t1.evt_id as evt_id,
    ( select min(evt_id)
      from   evt
      where  evt_id > t1.evt_id
      and    date_creation is not null
    ) as info
    from     evt as t1
    where    t1.date_creation is null
    order by evt_id;
    Pour la seconde phase, qui est beaucoup plus rapide, je viens mettre à jour la date de création à partir de la colonne info.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    update `toto` as t1
    set    t1.date_creation = 
    (
    	select date_creation
    	from evt
    	where evt_id = t1.info
    );
     
    select * from toto;
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  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,

    Ceci doit fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE evt
    	SET date_creation =  @tmp := COALESCE(date_creation, @tmp)
    ORDER BY evt_id DESC
    ;

  4. #4
    Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 120
    Points : 62
    Points
    62
    Par défaut
    Merci aieeeuuuuu pour cette solution, ça fonctionne très bien !
    Je ne connaissais pas cette fonction

    Merci !
    "Les tests sont au développement ce que le fromage est à la fondue"

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

Discussions similaires

  1. Recherche des enregistrements en fonction des paramètres
    Par infoctet dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/01/2007, 09h51
  2. Réponses: 4
    Dernier message: 31/10/2006, 19h03
  3. Réponses: 4
    Dernier message: 03/09/2006, 19h12
  4. Réponses: 2
    Dernier message: 27/07/2006, 07h46
  5. Trier les enregistrements en fonction de la date
    Par mpereg dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 12/09/2004, 14h16

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