Bonjour,
Je sèche sur un petit problème qui doit être resolvable proprement.
J'ai :
- une table contenant un Id et un Nom appelée Agents
- une table contenant un Id, un Nom, un Taux appelée Produits
- une table contenant un Id, un Id_agent, un Id_produit, un taux appelée Taux
Voici un exemple de la base de données :
Je voudrai une vue qui m'affiche tous les agents et produits avec leurs taux correspondant soit au taux de la table Taux, sinon au taux de la table produits.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 -- -- Structure de la table `agents` -- CREATE TABLE IF NOT EXISTS `agents` ( `id` int(11) NOT NULL auto_increment, `nom` varchar(25) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; -- -- Contenu de la table `agents` -- INSERT INTO `agents` (`id`, `nom`) VALUES (1, 'Agent 1'), (2, 'Agent 2'); -- -------------------------------------------------------- -- -- Structure de la table `produits` -- CREATE TABLE IF NOT EXISTS `produits` ( `id` int(11) NOT NULL auto_increment, `nom` varchar(25) NOT NULL, `taux` float NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; -- -- Contenu de la table `produits` -- INSERT INTO `produits` (`id`, `nom`, `taux`) VALUES (1, 'Produit 1', 5), (2, 'Produit 2', 10); -- -------------------------------------------------------- -- -- Structure de la table `taux` -- CREATE TABLE IF NOT EXISTS `taux` ( `id` int(11) NOT NULL auto_increment, `id_agent` int(11) NOT NULL, `id_produit` int(11) NOT NULL, `taux` float NOT NULL, PRIMARY KEY (`id`), KEY `id_agent` (`id_agent`,`id_produit`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; -- -- Contenu de la table `taux` -- INSERT INTO `taux` (`id`, `id_agent`, `id_produit`, `taux`) VALUES (1, 2, 2, 60), (2, 1, 2, 50);
J'ai essayé ceci :
Je voudrai donc que cette vue affiche :Code:
1
2
3
4
5
6
7
8 SELECT COALESCE(taux.id, 0) AS id, agents.id AS id_agent, produits.id AS id_produit, COALESCE(taux.taux, produits.taux) AS taux FROM agents, produits LEFT OUTER JOIN taux ON taux.id_agent = agents.id AND taux.id_produit = produits.id
id --- id_agent --- id_produit --- taux
0 ------- 1 ---------- 1 --------- 5
2 ------- 1 ---------- 2 --------- 50
1 ------- 2 ---------- 2 --------- 60
0 ------- 2 ---------- 2 --------- 10
Seulement cette vue ne fonctionne pas simplement parce que le LEFT OUTER JOIN ne se fais que sur produits.
D'après vous, serait il possible d'eviter quelque chose comme :
Merci d'avance pour toute réponse.Code:
1
2
3
4
5
6
7 SELECT COALESCE((SELECT id FROM taux WHERE taux.id_agent = agents.id AND taux.id_produit = produits.id), 0) AS id agents.id AS id_agent, produits.id AS id_produit, COALESCE((SELECT taux FROM taux WHERE taux.id_agent = agents.id AND taux.id_produit = produits.id), produits.taux) AS taux FROM agents, produits