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 : requête jointe

par Neophyte » 30 mars 2006, 19:07

Un grand merci pour cette explication complète et claire.

:D

par Ripat » 30 mars 2006, 09:18

Faire une jointure dans un WHERE est possible mais pas recommandé pour des raisons de lisibilité et de conformité aux standards SQL.

Commence par faire un recordset simple avec une jointure:

Code : Tout sélectionner

SELECT * FROM tbl_f f JOIN tbl_s s ON f.F11=s.id_p GROUP BY f.F0
Ensuite tu limites ta sélection avec une éventuelle condition:

Code : Tout sélectionner

SELECT * FROM tbl_f f JOIN tbl_s s ON f.F11=s.id_p WHERE ici_tes_conditions GROUP BY f.F0

explications

par Neophyte » 30 mars 2006, 08:14

:D
Ok, je vais compléter l'explication de mon premier message avec la structure (simplifiée) des 2 tables :

-- 
-- Structure de la table `tbl_s`
-- 

CREATE TABLE `tbl_s` (
  `id_p` varchar(15) NOT NULL default '',
  `nom_p` varchar(40) NOT NULL default '',
  `prenom_p` varchar(40) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


-- 
-- Contenu de la table `tbl_s`
-- 

INSERT INTO `tbl_s` VALUES ('52000', 'Boudo', 'Brigitte');
INSERT INTO `tbl_s` VALUES ('52100', 'Potter', 'Dominique');
INSERT INTO `tbl_s` VALUES ('53000', 'Deco', 'Alain');
        




-- 
-- Structure de la table `tbl_f`
-- 

CREATE TABLE `tbl_f` (
  `F0` int(5) NOT NULL auto_increment,
  `F11` varchar(15) NOT NULL default '',
  `F13` varchar(15) NOT NULL default '',
  `F15` char(1) NOT NULL default '',
  PRIMARY KEY  (`F0`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=145 ;

-- 
-- Contenu de la table `tbl_f`
-- 

INSERT INTO `tbl_f` VALUES (59, '52000', '52100', '2');
INSERT INTO `tbl_f` VALUES (60, '52100', '52100', '');
INSERT INTO `tbl_f` VALUES (61, '52000', '52100', '');
INSERT INTO `tbl_f` VALUES (62, '53000', '52100', '2');
INSERT INTO `tbl_f` VALUES (120, '52000', '52100', '2');
INSERT INTO `tbl_f` VALUES (143, '52100', '52100', '1');
INSERT INTO `tbl_f` VALUES (142, '52100', '52100', '');
INSERT INTO `tbl_f` VALUES (137, '52000', '52100', '2');
INSERT INTO `tbl_f` VALUES (138, '52100', '52100', '');
INSERT INTO `tbl_f` VALUES (139, '52100', '52100', '');
INSERT INTO `tbl_f` VALUES (140, '52100', '52100', '');
INSERT INTO `tbl_f` VALUES (141, '52100', '52100', '');
INSERT INTO `tbl_f` VALUES (134, '53000', '52000', '2');
INSERT INTO `tbl_f` VALUES (136, '52000', '52100', '2');
INSERT INTO `tbl_f` VALUES (144, '52000', '52100', '2');

Comme indiqué dans mon premier message :
La sélection est faite en fonction de certains résultats (en particulier des valeurs dans F11, F13 et F15). En bout de course, j'obtiens bien les bonnes extractions (voir requête ci-dessous), si ce n'est que je souhaiterais voir s'afficher sur chaque ligne les valeurs associées à F11 et non à F13. Actuellement, la requête ne me sort pas le nom et le prénom (de la table tbl_s) associé à F11.

Y a-t-il un moyen de faire cela d'une manière simple ? Ou doit-je me résoudre à faire cela en plusieurs étapes et quelques complications ?
Avec EasyPHP, la sélection suivante :

Code : Tout sélectionner

SELECT * FROM tbl_f, tbl_s where (tbl_f.F11=tbl_s.id_p AND tbl_f.F15='''') OR (tbl_f.F13=tbl_s.id_p AND tbl_f.F13=52000 AND tbl_f.F15!=1) OR tbl_f.F15='' OR tbl_f.F11=52000 GROUP BY tbl_f.F0
me donne les résultats suivants :


F0 F11 F13 F15 id_p nom_p prenom_p
59 52000 52100 2 52000 Boudo Brigitte
60 52100 52100 52000 Boudo Brigitte
61 52000 52100 52000 Boudo Brigitte
120 52000 52100 2 52000 Boudo Brigitte
134 53000 52000 2 52000 Boudo Brigitte
136 52000 52100 2 52000 Boudo Brigitte
137 52000 52100 2 52000 Boudo Brigitte
138 52100 52100 52000 Boudo Brigitte
139 52100 52100 52000 Boudo Brigitte
140 52100 52100 52000 Boudo Brigitte
141 52100 52100 52000 Boudo Brigitte
142 52100 52100 52000 Boudo Brigitte
144 52000 52100 2 52000 Boudo Brigitte


Ce que je recherche, c'est par ex que pour la ligne 138, j'obtienne :
138 52100 52100 52100 Potter Dominique
D'avance merci pour vos conseils.

par Cyrano » 29 mars 2006, 09:10

Je ne comprends pas clairement ton problème : mets nous la structure des deux tables et un exemple pour illustrer ton propos, ce sera plus facile de te répondre.

toujours dans l'ornière...

par Neophyte » 29 mars 2006, 07:42

:cry:

Bonjour,

Je suis toujours dans l'ornière de cette requête... Un grand merci à celle ou celui qui peut m'aider ou me mettre sur la piste de la solution, car là je suis bloqué.

$query="SELECT * FROM tbl_1, tbl_s
where (tbl_f.F11=tbl_s.id_p AND tbl_f.F15='''')
OR (tbl_f.F13=tbl_s.id_p AND tbl_f.F13=$_SESSION[USER_ID] AND tbl_f.F15!=1)
OR tbl_f.F15=''
OR tbl_f.F11=$_SESSION[USER_ID]
GROUP BY tbl_f.F0 ORDER BY tbl_f.F3, tbl_f.F1";

requête jointe

par Neophyte » 25 mars 2006, 11:08

Bonjour,

Je croche sur un problème que je ne sais comment aborder.

L'idée : j'ai 2 tables à joindre :
- tbl_f ---> différents champs, dont un numéro d'identification qui peut être le même ou différent dans les champs F11 et F13.

- tbl_s ---> ex : un numéro d'identité, nom, prénom

La sélection est faite en fonction de certains résultats (en particulier des valeurs dans F11, F13 et F15). En bout de course, j'obtiens bien les bonnes extractions (voir requête $query ci-dessous), si ce n'est que je souhaiterais voir s'afficher sur chaque ligne les valeurs associées à F11 et non à F13. Actuellement, la requête me sort le nom et le prénom (de la table tbl_s) associé à F11 ou à F13 selon le résultat de $query.

Y a-t-il un moyen de faire cela d'une manière simple ? Ou doit-je me résoudre à faire cela en plusieurs étapes et quelques complications ?

Merci de vos conseils.
$query="SELECT * FROM tbl_1, tbl_s where (tbl_f.F11=tbl_s.id_p AND tbl_f.F15='''') OR (tbl_f.F13=tbl_s.id_p AND tbl_f.F13=$_SESSION[USER_ID] AND tbl_f.F15!=1) OR tbl_f.F15='' OR tbl_f.F11=$_SESSION[USER_ID] GROUP BY tbl_f.F0 ORDER BY tbl_f.F3, tbl_f.F1";