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/03/2011, 02h21   #1
Invité régulier
 
Inscription : juin 2007
Messages : 19
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 19
Points : 7
Points : 7
Par défaut JOIN "Nom de table" issu d'un select

Bonjour à tous,

Quelqu'un saurait comment on fait pour insérer dans un JOIN le nom d'une table issue de la requête ?

exemple :
Code :
1
2
3
4
SELECT T1.id as id, T1.produit as produit, T1.nom_table as nom_table
FROM table 1 as T1
LEFT JOIN nom_table as T2 ON T2.id=T1.produit
Merci beaucoup de votre aide !
bupocirk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 11h05   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Bonjour,

J'avoue ne pas bien comprendre votre problème ...
Un petit exemple ?
Si c'est un nom que vous souhaitez mettre dynamiquement dans la requête, il faut jeter un œil du côté des commandes préparées.

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 14h50   #3
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Bonjour,
Je suis curieux de voir un aperçu de la base car je ne comprends pas bien non plus.
D'autre part, vous faites une jointure gauche, donc vous aurez tous les enregistrements de T1 et seulement les enregistrements de T2 correspondant mais vous n'utilisez aucune colonne de T2, alors à quoi bon cette jointure si elle ne sert ni à filtrer, ni à récupérer des informations ?
Eclairez nous un peu plus sur le sujet.
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 03h26   #4
Invité régulier
 
Inscription : juin 2007
Messages : 19
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 19
Points : 7
Points : 7
Bonjour, et Merci Ced, Patic de tenter de m' aider

Oui j' ai voulu faire un mini exemple mais ce n' était pas une bonne idée, désolée !

Voici un autre mini exemple de mes tables :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
CREATE TABLE IF NOT EXISTS `agents` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `entreprise` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
 
--
-- Contenu de la table `agents`
--
 
INSERT INTO `agents` (`id`, `entreprise`) VALUES
(1, 'Agent 1'),
(2, 'Agent 2');
 
-- --------------------------------------------------------
 
--
-- Structure de la table `clients`
--
 
CREATE TABLE IF NOT EXISTS `clients` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `entreprise` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
 
--
-- Contenu de la table `clients`
--
 
INSERT INTO `clients` (`id`, `entreprise`) VALUES
(1, 'Client 1'),
(2, 'Client 2');
 
-- --------------------------------------------------------
 
--
-- Structure de la table `contacts`
--
 
CREATE TABLE IF NOT EXISTS `contacts` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `table` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `entreprise` int(11) UNSIGNED NOT NULL,
  `nom` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `tel` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;
 
--
-- Contenu de la table `contacts`
--
 
INSERT INTO `contacts` (`id`, `table`, `entreprise`, `nom`, `tel`) VALUES
(1, 'agents', 1, 'DURAND Paul', '555666777'),
(2, 'clients', 2, 'DUPONT Jacques', '555222333'),
(3, 'fournisseurs', 1, 'DESCHAMPS Robert', '555777888'),
(4, 'clients', 2, 'LESAINT Jacques', '555111222');
 
-- --------------------------------------------------------
 
--
-- Structure de la table `fournisseurs`
--
 
CREATE TABLE IF NOT EXISTS `fournisseurs` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `entreprise` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
 
--
-- Contenu de la table `fournisseurs`
--
 
INSERT INTO `fournisseurs` (`id`, `entreprise`) VALUES
(1, 'Fournisseur 1'),
(2, 'Fournisseur 2');
Ma table "contacts" contient le nom d'une autre table dans sa colonne "table".

J' aimerais savoir comment faire pour récupérer le nom de la table contenu dans cette colonne et la mettre dans le JOIN de la même requête...

Pour obtenir :

DUPONT Jacques / 555222333 / Entreprise : Client 2
DURAND Paul / 555666777 / Entreprise : Agent 1

Voila.

Merci beaucoup
bupocirk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 19h18   #5
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Bonjour,
Je me trompe peut être, n'ayant qu'une connaissance pratique du sql comme autodidacte et non une connaissance théorique. Vous ne pouvez pas avoir une seule jointure avec une table jointe différente pour chaque ligne, on travaille ici avec des ensembles. Cela serait peut être faisable avec du sql dynamique en traitant ligne à ligne puis en alimentant une table temporaire avec le résultat de chaque ligne mais à mon avis il y a mieux.
Si vous pouvez revoir la structure de la base, il serait possible, sur la même idée qu'un objet, de créer une seule et même table qui comprendrai toutes les sociétés quel que soit leur type (agent, client, etc), on ajouterai alors simplement une colonne pour le type comme on le ferait avec un attribut d'une classe. Le seul problème est si vous pouvez avoir une même société sur plusieurs types. Ensuite il n'y a plus de problèmes avec la jointure sur la table contact puisqu'il n'y aura pas de doublon de clés.
Une autre possibilité, vous créez des clés alphanumériques composées, comme AG00001 pour agent, etc.
Encore une autre possibilité, vous faites une requête comme celle ci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
nom,
tel,
CASE 
	WHEN `table` = 'agents' THEN t2.entreprise
	WHEN `table` = 'clients' THEN t3.entreprise
	WHEN `table` = 'fournisseurs' THEN t4.entreprise
END AS Entreprise
FROM contacts t1
LEFT OUTER JOIN agents t2 ON t2.id = t1.entreprise AND t1.TABLE = 'agents'
LEFT OUTER JOIN clients t3 ON t3.id = t1.entreprise AND t1.TABLE = 'clients'
LEFT OUTER JOIN fournisseurs t4 ON t4.id = t1.entreprise AND t1.TABLE = 'fournisseurs'
Vous pourriez aussi faire une seule jointure avec une vue qui regrouperait les différentes tables en ajoutant une colonne 'type'.
Bon courage
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 00h32   #6
Invité régulier
 
Inscription : juin 2007
Messages : 19
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 19
Points : 7
Points : 7
Par défaut Résolu Merci !!!

Bonsoir Patic !

Votre exemple [code] fonctionne parfaitement !

Merci infiniment
bupocirk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h05.


 
 
 
 
Partenaires

Hébergement Web