intégration d'une sous-requête dans une requête jointe

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : intégration d'une sous-requête dans une requête jointe

par Neophyte » 04 août 2007, 08:55

C'est exactement cela.
Merci et bonne journée !

par Hubert Roksor » 04 août 2007, 00:38

Bon, ben si tu veux restreindre les conditions de jointure, c'est bien dans la jointure qu'il faut ajouter ta condition supplémentaire. Si tu le mets dans le WHERE, tu ne récupèreras que les enregistrements ayant une correspondance dans les deux tables, comme tu as pu le remarquer.

En arrageant ta première requête,

Code : Tout sélectionner

SELECT t.*, u.* FROM base1.tbl_1 AS t LEFT JOIN base.tbl_user AS u ON u.id_us = t.id_p WHERE t.nom_p LIKE 'd%' ORDER BY t.nom_p, t.prenom_p
devient

Code : Tout sélectionner

SELECT t.*, u.* FROM base1.tbl_1 AS t LEFT JOIN base.tbl_user AS u ON (u.id_us = t.id_p AND u.num_client_us = 1) WHERE t.nom_p LIKE 'd%' ORDER BY t.nom_p, t.prenom_p

par Neophyte » 03 août 2007, 12:17

Voici le complément d'information.
Les 2 tables ci-dessous sont dans 2 BDD différentes.

Merci.

Code : Tout sélectionner

-- -- Structure de la table `tbl_user` -- CREATE TABLE `tbl_user` ( `n_us` int(11) NOT NULL auto_increment, `username` varchar(25) NOT NULL default '', `id_us` varchar(15) NOT NULL default '', `num_client_us` int(11) NOT NULL default '0', PRIMARY KEY (`n_us`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=426 ; -- -- Structure de la table `tbl_1` -- CREATE TABLE `tbl_1` ( `id_p` varchar(15) NOT NULL default '', `nom_p` varchar(40) NOT NULL default '', `prenom_p` varchar(40) NOT NULL default '', PRIMARY KEY (`id_p`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

par Hubert Roksor » 03 août 2007, 12:02

Il faudrait que tu donnes des aliases à tes tables pour plus de clarté (éviter de taper le nom de la base plus le nom de la table à chaque champs) et surtout que tu indiques la table d'origine de chaque colonne. Impossible dans ton exemple de savoir d'où viennent nom_p ou prenom_p.

De plus, tu as oublié de [poster le schéma des tables pertinentes à votre requête sous la forme d'une instruction "CREATE TABLE"]. Si l'avertissement s'affiche en rouge sur l'écran durant la rédaction du sujet, c'est bien qu'il y a une raison !

par Neophyte » 03 août 2007, 10:48

Je viens de tester la suggestion ci-dessous. Elle fonctionne mais est trop restrictive, puisque cette clause élimine tous les records qui ne se trouvent pas dans les 2 tables, ce que je n'avais pas avec la jointure.

Code : Tout sélectionner

SELECT * FROM base1.tbl_1 WHERE base1.tbl_1.id_p IN (SELECT id_us FROM base.tbl_user WHERE num_client_us ='1') AND nom_p LIKE 'd%' ORDER BY nom_p,prenom_p
L'idée est la suivante : dans base.tbl_user, j'ai des records qui peuvent avoir le même numéro d'identification (base1.tbl_1.id_p). En conséquence, je souhaite filtrer sur un autre champ (SELECT id_us FROM base.tbl_user WHERE num_client_us ='1') puis je fais la jointure (c.f. mon premier message). C'est un peu tordu mais c'est nécessaire car je ne peux exclure a priori des numéros d'identification synonyme dans base1.tbl_1.id_p.

par d0m » 03 août 2007, 09:46

Tu peux faire une sous requete selectionnant les id_us de la table tbl_user vérifiant ta condition :

Code : Tout sélectionner

SELECT * FROM base1.tbl_staff WHERE base1.tbl_staff.id_p IN (SELECT id_us FROM base.tbl_user WHERE num_client_us ='1') AND nom_p LIKE 'd%' ORDER BY nom_p,prenom_p

intégration d'une sous-requête dans une requête jointe

par Neophyte » 03 août 2007, 09:33

Bonjour,

Je suis coincé avec une requête...
- je me connecte sur 2 bases (base et base 1)
- je fais une jointure de tables sous cette forme (la liaison se fait sur le numéro d'identification de la personne) :

Code : Tout sélectionner

SELECT * FROM base1.tbl_1 LEFT OUTER JOIN ON base1.tbl_1.id_p = base.tbl_user.id_us WHERE nom_p LIKE 'd%' ORDER BY nom_p,prenom_p
Les éléments ci-dessus fonctionnent. Par contre, je ne sais comment greffer la clause ci-dessous qui devrait être effectué avant la jointure afin de restreindre la sélection dans base.tbl_user :

Code : Tout sélectionner

SELECT * FROM base.tbl_user WHERE num_client_us ='1'
J'imagine qu'il y a un moyen avec MySQL de le faire sans jongler avec le PHP.

Merci de votre aide.