Requêtes avancées : jointure ou pas ?

Résolu/Fermé
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 29 mars 2015 à 15:46
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 29 mars 2015 à 17:01
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

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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
29 mars 2015 à 16:24
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
29 mars 2015 à 16:26
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > Utilisateur anonyme
Modifié par zipe31 le 29/03/2015 à 16:31
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
29 mars 2015 à 16:36
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > Utilisateur anonyme
29 mars 2015 à 16:46
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