Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/11/2011, 14h59   #1
Membre habitué
 
Inscription : avril 2005
Messages : 266
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 266
Points : 127
Points : 127
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 :
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.
tchoukapi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2011, 20h22   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 531
Points : 3 524
Points : 3 524
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 :
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 :
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 15h25   #3
Membre habitué
 
Inscription : avril 2005
Messages : 266
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 266
Points : 127
Points : 127
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
tchoukapi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 15h49   #4
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 531
Points : 3 524
Points : 3 524
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 :
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h11   #5
Membre habitué
 
Inscription : avril 2005
Messages : 266
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 266
Points : 127
Points : 127
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
tchoukapi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h21   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 531
Points : 3 524
Points : 3 524
Bizarre !
Et comme ça
Code :
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h32   #7
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 656
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 656
Points : 2 658
Points : 2 658
Requête scalaire ca pu,

préférez une sous-requête (enfin ceci dit le poisson va encore se mordre la queue, il faudrai plutôt revoir le besoin) :

Code :
1
2
3
4
5
 
SELECT DISTINCT cli.Id, com.Statut
FROM clients cli 
LEFT OUTER JOIN (SELECT DISTINCT cli_id FROM commandes 
                  WHERE com.Statut = 'S') com ON com.cli_id = cli.id
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 17h01   #8
Membre habitué
 
Inscription : avril 2005
Messages : 266
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 266
Points : 127
Points : 127
Cette requête me ramène le même résultat que la 1ère.
Mais c'est très bien j'ai eu mes réponses.

Je vous remercie.
tchoukapi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 17h06   #9
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 656
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 656
Points : 2 658
Points : 2 658
Dans ce cas, soit :
- vous avez une realtion de type (1,1) entre commande et client
- votre jeux de donnée est très limité.
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 17h20   #10
Membre habitué
 
Inscription : avril 2005
Messages : 266
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 266
Points : 127
Points : 127
J'ai une relation 1Client -> nCommandes
et mon jeu de donnée est pas forcément tres limité 5000commandes / années
tchoukapi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h38.


 
 
 
 
Partenaires

Hébergement Web