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 sous requete


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    269
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 269
    Par défaut Update table avec sous requete
    Bonjour,

    Je possède une table clients et une table commande.
    Ayant un lien 1 --> n (un client plusieurs commandes)
    Actuellement lors ce que je supprime une commande le client associé n'est pas supprimé (virtuellement flag à 'S').

    Je souhaiterais donc mettre a jour tous les clients qui sont actuellement liés a une commande supprimées ('S').

    J'utilise donc une table intermédiaire. mais l'update ne fonctionne pas.
    Aucune ligne n'est traitée..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE idsClientsSupp AS (SELECT com.idClient FROM clients cli, commandes com WHERE cli.Id = com.idClient and com.Statut='S');
     
    UPDATE clients SET Statut = 'S' WHERE Id IN (SELECT idClient FROM idsClientsSupp );
     
    DROP TABLE idsClientsSupp ;
    Merci de votre aide.

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Si c'est ce que je crois comprendre, en fait un commande n'est jamais supprimée, c'est juste son statut qui est mis à 'S'.
    Alors pourquoi ne pas faire l'UPDATE sur la table clients en mettant juste la table commandes en jointure dans l'UPDATE ?
    Code MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE clients cli INNER JOIN commandes com ON com.idClient=cli.Id
    SET cli.Statut = 'S' 
    WHERE com.Statut='S'
    Toutefois, le sens conceptuel de l'attribut clients.Statut m'échappe. Il ne peut que vouloir dire : "ce client a des factures supprimées" et je trouve plutôt maladroit de figer cette information que l'on peut toujours obtenir par cette requête
    Code MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT cli.Id, com.Statut
    FROM clients cli 
    LEFT JOIN commandes com 
        ON com.idClient=cli.Id
            AND com.Statut = 'S'
    dans le résultat de laquelle les lignes où com.Statut retournera NULL seront celles des clients n'ayant pas de factures supprimées.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    269
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 269
    Par défaut
    Effectivement cela fonctionne beaucoup mieux.
    Je te remercie.
    Je vais effectivement conserver ta solution. Mettre le client à supprimer est assez maladroit.
    Autant récupérer les clients sans ou avec des commandes supprimées.

    Merci

  4. #4
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    N'étant pas encore tombé dans la léthargie de ma sieste vespérale, et ayant l'esprit un peu plus vif qu'à l'heure matutinale où j'ai posté, je m'aperçois que si un client possède plusieurs factures (supprimées ou pas) la requête en interrogation va retourner autant de lignes que de commandes de ce client.
    Si l'on ajoute DISTINCT, on aura quand même deux lignes s'il y a au moins une commande chaque (annulée ou pas).
    Donc on est obligé de passer par une sous-requête corrélée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT cli.Id,
    CASE WHEN EXISTS (SELECT * FROM commandes com
                      WHERE com.idClient=cli.Id
                             AND com.Statut = 'S')
    THEN 'S'
    END as Statut
    FROM clients cli
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    269
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 269
    Par défaut
    Cette nouvelle requête me ramène l’intégralité des clients avec un statut de commande 'S' alors que tous les clients n'ont pas forcément une commande à 'S'.

    La requête précédente me ramène effectivement tous les clients avec le statut de la commande 'S' ou NULL

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Bizarre !
    Et comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT cli.Id,
    CASE WHEN EXISTS (SELECT * FROM commandes com
                      WHERE com.idClient=cli.Id
                             AND com.Statut = 'S')
    THEN 'S'
    ELSE NULL
    END AS Statut
    FROM clients cli
    ou alors je suis déjà en train de faire ma sieste.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

Discussions similaires

  1. MySQL: Probleme d'UPDATE avec sous requete SELECT
    Par simonius dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/11/2007, 14h57
  2. Débutant: UPDATE d'une table avec sous-requête ?
    Par ctobini dans le forum Débuter
    Réponses: 2
    Dernier message: 03/10/2007, 11h45
  3. Requete Update avec sous requete et jointure
    Par javaboy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/05/2007, 11h03
  4. Requete Update avec sous requete
    Par joziel dans le forum Langage SQL
    Réponses: 7
    Dernier message: 28/08/2006, 15h15
  5. problème update avec sous requetes
    Par stoz dans le forum Langage SQL
    Réponses: 6
    Dernier message: 12/10/2005, 16h44

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