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 :

[Optimisation] Requêtes d'update avec jointure?


Sujet :

Requêtes MySQL

  1. #1
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut [Optimisation] Requêtes d'update avec jointure?
    Salut à tous !

    Mon problème est assez simple, mais je cherche la façon la plus efficace de faire.

    J'ai 2 tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    TABLE_1
    {
      TABLE_1_ID;
      ...
    }
     
    TABLE_2
    {
       TABLE_2_ID;
       TABLE_1_ID;
       TABLE_2_DATE TIMESTAMP;
       ...
    }
    Ma table TABLE_2 possède une FK vers TABLE_1.

    Je cherche à faire un update sur ma table TABLE_1, sur toutes les lignes qui respectent ces conditions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    update TABLE_1 t1 set mesChamps
    where t1.TABLE_1_ID 
    in (select t2.TABLE_1_ID from TABLE_2 t2 where t2.TABLE_2_DATE between
    startDate and endDate)
    and t1.TABLE_1_ID
    not in (select t2.TABLE_1_ID from TABLE_2 t2 where t2.TABLE_2_DATE not between startDate and endDate)
    En gros, ce que je cherche à faire c'est d'updater les lignes de TABLE_1 dont les identifiants sont strictement à l'intérieur de l'intervalle de temps précisé dans la table TABLE_2.

    En résumé :

    Je regarde dans TABLE_2 tous les identifiants TABLE_2.TABLE_1_ID qui correspondent à des enregistrements de TABLE_2 dont le champ TABLE_2.TABLE_2_DATE est entre les bornes précisées MAIS, je ne veux pas les identifiants TABLE_2.TABLE_1_ID qui sont également en dehors des bornes précisées.

    Je pensais faire avec une jointure externe LEFT JOIN, mais je ne vois pas trop comment m'y prendre, si vous avez des pistes, elles sont les bienvenues !

    J'espère que j'ai été assez clair
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

  2. #2
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je pense que ceci devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    update TABLE_1 t1 
    INNER JOIN TABLE_2 t2 ON t1.TABLE_1_ID = t2.TABLE_1_ID
    set mes_colonnes = leurs_valeurs
    where t2.TABLE_2_DATE between startDate and endDate
    A essayer sur table et jeu de données fictifs d'abord.
    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 !

  3. #3
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    Salut ! Et merci pour la réponse.

    Malheureusement, avec cette requête, je peux me retrouver avec des enregistrements de TABLE_1 qui sont référencés par des enregistrements de TABLE_2 qui ne répondent pas au critère de date... :'(

    Par exemple :
    TABLE_1 :

    TABLE_1_ID | Mes autres champs
    1 | blabla


    TABLE_2 :

    TABLE_2_ID | TABLE_1_ID | Mon champ de date
    1 | 1 | OK (en dedans de startDate & EndDate)
    2 | 1 | NOK (en dehors de startDate & EndDate)
    Après la jointure je me retrouve avec 2 lignes.
    (1 |1 | 1 | OK) & (1 | 1 | 2 | NOK) avec dans l'ordre (TABLE_1_ID, TABLE_1_ID, TABLE_2_ID, Date)

    Ensuite on applique le where, il me reste donc qu'une ligne :
    (1 | 1 | 1 | OK). MAIS il ne faut surtout pas que j'update cette ligne, car l'identifiant TABLE_1_ID est présent dans l'autre ligne de TABLE_2 alors que cette autre ligne ne respecte pas le critère de date :'(
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

  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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Alors comme ça peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE TABLE_1 t1 
    INNER JOIN TABLE_2 t2 ON t1.TABLE_1_ID = t2.TABLE_1_ID
    SET mes_colonnes = leurs_valeurs
    WHERE t2.TABLE_2_DATE BETWEEN startDate AND endDate
      AND NOT EXISTS (
        SELECT *
        FROM TABLE_2 t22
        WHERE t22.TABLE_1_ID = t1.TABLE_1_ID
          AND t22.TABLE_2_DATE NOT BETWEEN startDate AND endDate
      )
    Je fais la jointure entre t1 et t2 sur TABLE_1_ID.
    Je ne garde que les lignes où TABLE_2_DATE est dans la période à condition qu'il n'existe pas d'autre ligne de TABLE_2 (t22) en relation avec le même TABLE_1_ID dont la date ne serait pas dans la période.

    C'est ce que tu veux ?
    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 averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    C'est EXACTEMENT ça

    Je teste ça et je tiens au courant !

    Merci beaucoup ^^
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

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

Discussions similaires

  1. [MySQL-5.1] Requête UPDATE avec jointure
    Par transistor49 dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/05/2014, 22h43
  2. Requête update avec jointure
    Par wolfdream dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/03/2011, 10h19
  3. Requête Update avec jointure
    Par maph1 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/02/2008, 00h10
  4. Requête UPDATE avec jointure
    Par petburn dans le forum SQL
    Réponses: 7
    Dernier message: 30/07/2007, 14h22
  5. Requete update avec jointure d'une requête
    Par bart64 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 28/05/2007, 20h31

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