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 :

Requête UPDATe avec tables liées


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 33
    Par défaut Requête UPDATe avec tables liées
    Bonjour,

    J'ai 2 tables :

    Table T1 avec colonnes :
    - T1_ID (clef primaire)
    - T1_STATUT (valeur 0 ou 1)

    Table T2 avec colonnes :
    - T2_ID (clef primaire)
    - T2_T1_ID (clef étrangère de T1)
    - T2_STATUT (valeur 0 ou 1)

    T1 et T2 sont donc jointes par une relation un à plusieurs via les colonnes T1_ID et T2_T1_ID

    Je veux mettre mettre à jour la table T1 (écrire 0 dans T1_STATUT) lorsque T1_STATUT = 1 et que tous les enregistrements associés de T2 ont T2_STATUT = 0.

    La requête SQL suivante ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T1, (SELECT T2_T1_ID FROM T2 GROUP BY T2_T1_ID HAVING MAX(T2_STATUT) = 0 AND MIN(T2_STATUT) = 0) T SET T1_STATUT = 0 WHERE T1_STATUT = 1 AND T1_ID = T.T2_T1_ID
    Comment faire ?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,


    il faut passer par un test de non existence (NOT EXISTS)


    Vous voulez mettre à jour les lignes de T1 dont aucune ligne dans T2 n'a de statut à 1.


    Faites déjà le select, et l'update en découlera.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 33
    Par défaut Requête UPDATE avec tables liées
    Bonjour punkoff

    Merci pour cette réponse. En fait, je pense que j'ai mal formulé mon problème, et donc votre réponse n'est pas tout a fait adaptée.

    Voici ce que je veux faire : Je veux mettre mettre les enregistrements de la table T1 (écrire 0 dans T1_STATUT) pour lesquels T1_STATUT = 1 et pour lesquels les enregistrements associés (joints) dans T2 ont tous T2_STATUT = 0.

    Merci de votre aide,

    Cordialement,

  4. #4
    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
    Je veux mettre mettre les enregistrements de la table T1 (écrire 0 dans T1_STATUT) pour lesquels T1_STATUT = 1 et pour lesquels les enregistrements associés (joints) dans T2 ont tous T2_STATUT = 0.
    1) Lignes (et pas enregistrements) de T1 qui ont T1_STATUT = 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T1_ID
    FROM T1
    WHERE T1_STATUT = 1
    2) Lignes de T2 (associées à ces lignes de T1) qui ont toutes T2_STATUT = 0
    Autrement dit, comme l'a très bien traduit punkoff :
    Lignes de T1 (ayant T1_STATUT = 1) pour lesquelles il n'existe pas de lignes associées en T2 ayant un T2_STATUT = 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT T1_ID
    FROM T1
    WHERE T1_STATUT = 1
        AND NOT EXISTS
        (
            SELECT *
            FROM T2
            WHERE T2.T2_T1_ID = T1.T1_ID
                AND T2.T2_STATUT = 1
        )
    Vérifiez déjà que cette requête répond à votre besoin et vous devriez être capable de faire l'UPDATE à partir de ce SELECT.
    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 !

  5. #5
    J1
    J1 est déconnecté
    Membre expérimenté Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Par défaut
    Bonjour,

    Citation Envoyé par CinePhil Voir le message
    1) Lignes (et pas enregistrements) de T1 qui ont T1_STATUT = 1

    2) Lignes de T2 (associées à ces lignes de T1) qui ont toutes T2_STATUT = 0
    Autrement dit, comme l'a très bien traduit punkoff :
    Lignes de T1 (ayant T1_STATUT = 1) pour lesquelles il n'existe pas de lignes associées en T2 ayant un T2_STATUT = 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT T1_ID
    FROM T1
    WHERE T1_STATUT = 1
        AND NOT EXISTS
        (
            SELECT *
            FROM T2
            WHERE T2.T2_T1_ID = T1.T1_ID
                AND T2.T2_STATUT = 1
        )
    Pas sûr que cette requête réponde tout à fait à la demande de zebulon36.
    Sa formulation "Lignes de T2 (associées à ces lignes de T1) qui ont toutes T2_STATUT = 0" n'indique en effet pas clairement si une ligne de T1 (avec T1_statut=1) sans aucune ligne associée dans T2 doit ou non être mise à jour. Si l'on se fie à la requête qu'il proposait initialement, on pourrait d'ailleurs penser que non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T1, (SELECT T2_T1_ID FROM T2 GROUP BY T2_T1_ID HAVING MAX(T2_STATUT) = 0 AND MIN(T2_STATUT) = 0) T SET T1_STATUT = 0 WHERE T1_STATUT = 1 AND T1_ID = T.T2_T1_ID
    L'idée de sa requête semble bien être de ne procéder à la mise à jour que s'il existe réellement des lignes liées dans T2 et que celles-ci ont toutes pour statut 0.

    Après, il est également possible que dans sa base, toute ligne de T1 ait toujours des lignes liées dans T2, auquel cas la question que je soulève ne se pose en fait pas.

  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
    Par défaut
    Citation Envoyé par zebulon36 Voir le message
    La requête SQL suivante ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T1, (SELECT T2_T1_ID FROM T2 GROUP BY T2_T1_ID HAVING MAX(T2_STATUT) = 0 AND MIN(T2_STATUT) = 0) T SET T1_STATUT = 0 WHERE T1_STATUT = 1 AND T1_ID = T.T2_T1_ID
    Pourquoi ne fonctionne-t-elle pas ??? elle devrait !

Discussions similaires

  1. Requête Update avec tables liées
    Par Ant01ne dans le forum Développement
    Réponses: 2
    Dernier message: 14/04/2015, 17h04
  2. Requête update avec un select sur la même table
    Par sheira dans le forum Requêtes
    Réponses: 6
    Dernier message: 15/09/2010, 16h09
  3. Requète UPDATE avec sous-requète dans la même table.
    Par Selenite dans le forum Langage SQL
    Réponses: 6
    Dernier message: 16/03/2009, 15h04
  4. Requête UPDATE avec variables...
    Par yokyok dans le forum Outils
    Réponses: 2
    Dernier message: 18/05/2006, 10h37
  5. [VB.NET] [ODBC] Pb requête UPDATE avec clé primaire..?
    Par Pleymo dans le forum Windows Forms
    Réponses: 7
    Dernier message: 09/03/2005, 18h46

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