Requêtes avancées : jointure ou pas ?

Résolu
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   -  
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   -
Salut @ tou(te)s,

Je suis en plein apprentissage des BDD et je digère très difficilement tout ce qu'il m'a été donné à manger depuis une semaine ;-))

Je vous expose le schéma, je vous mets juste le contenu de la base (Facture) et les 2 tables qui sont en jeux pour l'instant (Client et Vendeur) :

[jp@localhost] (Facture) > show tables;
+-------------------+
| Tables_in_Facture |
+-------------------+
| Client            |
| Facture           |
| Règlement         |
| Vendeur           |
+-------------------+
4 rows in set (0.00 sec)

[jp@localhost] (Facture) > select * from Client;
+-------------+----------------+-----------+--------------+
| code_client | raison_sociale | ville     | code_vendeur |
+-------------+----------------+-----------+--------------+
|           1 | SA Dejoncours  | Marseille |            1 |
|           2 | SARL Ajax      | Marignane |            1 |
|           3 | SA Garaux      | Sète      |            1 |
|           4 | SA Décapage    | Bordeaux  |            2 |
|           5 | EURL Demaison  | Pauillac  |            2 |
+-------------+----------------+-----------+--------------+
5 rows in set (0.00 sec)

[jp@localhost] (Facture) > select * from Vendeur;
+--------------+-------------+-------+------+
| code_vendeur | nom_vendeur | ville | ca   |
+--------------+-------------+-------+------+
|            1 | Tixier      | NULL  | NULL |
|            2 | Durand      | NULL  | NULL |
+--------------+-------------+-------+------+
2 rows in set (0.00 sec)

À partir de là il m'est demandé d'afficher le nom des vendeurs qui suivent 3 clients ou plus.

Pas de problème pour afficher le code_vendeur qui répond aux critères demandés¹ :

[jp@localhost] (Facture) > select  code_vendeur,count(code_vendeur) from Client \
group by code_vendeur having count(code_vendeur) >= 3;
+--------------+---------------------+
| code_vendeur | count(code_vendeur) |
+--------------+---------------------+
|            1 |                   3 |
+--------------+---------------------+
1 row in set (0.00 sec)

Par contre, je n'arrive absolument pas à construire la requête qui récupère le code_vendeur de la requête ci-dessus, et que celle-là, pour pouvoir afficher le nom du vendeur par la suite ;-(

En gros ma demande se résume juste à comment n'exploiter (ou n'afficher) qu'un seul champ d'une requête en contenant 2 ou plusieurs ?

Merci aux âmes charitables qui voudront bien m'éclairer sur ce point.


¹ Merci aux puristes d'être indulgents si ma requête n'est pas la plus simple ni la plus optimisée ;-\

1 réponse

Utilisateur anonyme
 
Bonjour zipe

Pas essayé, mais à vue de nez :
select  Client.code_vendeur,nom_vendeur, count(Client.code_vendeur) from Client INNER JOIN Vendeur ON Client.code_vendeur=Vendeur.code_vendeur \
group by Client.code_vendeur having count(Client.code_vendeur) >= 3;


L'idée est de dire avec le inner join quelle est la deuxième table et avec le ON le critère qui relie les deux tables. Par ailleurs, pour éviter les ambiguïtés, il est bon de préciser table.champ au lieu du nom de champ seul quand le même nom apparaît dans les deux.
Je ne suis pas spécialiste non plus, les puristes amélioreront. En particulier je crois que quand le champ qui sert à la jointure est le même dans les deux tables, un
ON code_vendeur
est suffisant. Et qu'avec un alias, l'écriture pourrait être un peu allégée.
3
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
C'est parfait tout ça, merci papa ;-))

> select  Client.code_vendeur,nom_vendeur, count(Client.code_vendeur) \
from Client INNER JOIN Vendeur \
on Client.code_vendeur=Vendeur.code_vendeur  \
group by Client.code_vendeur having count(Client.code_vendeur) >= 3;
+--------------+-------------+----------------------------+
| code_vendeur | nom_vendeur | count(Client.code_vendeur) |
+--------------+-------------+----------------------------+
|            1 | Tixier      |                          3 |
+--------------+-------------+----------------------------+
1 row in set (0.00 sec)


Question subsidiaire : Si je ne veux que le nom du vendeur en sortie, comme apparemment les champs affichés sont déclarés dans le
select
, comment doit-on s'y prendre ?

Merci encore.
0
Utilisateur anonyme > zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention  
 
Si tu ne veux que le nom, tu ne demandes que le nom, pardi :-)
Select nom_vendeur FROM et le reste de la requête inchangé.
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430 > Utilisateur anonyme
 
Ah ok, mais en inversant le nom des tables, sans quoi le moteur fait un peu la gueule ;-)

select  Vendeur.nom_vendeur from Vendeur 
INNER JOIN Client on Client.code_vendeur=Vendeur.code_vendeur  
group by Client.code_vendeur having count(Client.code_vendeur) >= 3;
+-------------+
| nom_vendeur |
+-------------+
| Tixier      |
+-------------+


Merci beaucoup le père, bonne fin d'après-midi.
0
Utilisateur anonyme > zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention  
 
mais en inversant le nom des tables
Tu m'étonnes beaucoup,là, je ne vois pas le rapport.
Tu peux me coller le message d'erreur ? Ça m'évitera de créer les tables pour le refaire, parce que je n'aime pas ne pas comprendre.
Merci d'avance.
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430 > Utilisateur anonyme
 
Oups, je n'ai rien dit, c'est moi qui avais fait une erreur dans le nom des champs ;-(

Toutes mes plates et mes confuses ;-[

select  nom_vendeur from Client 
INNER JOIN Vendeur on Client.code_vendeur=Vendeur.code_vendeur  
group by Client.code_vendeur having count(Client.code_vendeur) >= 3;
+-------------+
| nom_vendeur |
+-------------+
| Tixier      |
+-------------+


J'étais persuadé qu'il fallait à tous prix que le champ du SELECT corresponde avec la table du FROM, mais apparemment ce n'est pas le cas, à cause du INNER JOIN ?
0