Bonjour,
Je m'initie (non sans mal) à MySQL (et autre) et je suis en train de développer un petit projet perso (en local pour moi, donc sans trop se poser des questions de sécurité) et je suis tombé sur un "petit" os ... pour vous l'expliquer, il faudrait que je rentre dans le détails de ma base de données, comment celle-ci doit fonctionner et ça prendrais pas mal de temps. Donc j'ai décidé de prendre un exemple plus simple pour vous exposer mon petit "souci"...
Un graph vaut mieux que de long discours :
Dans cette base, des utilisateurs peuvent aimer une ou plusieurs couleurs, conduire un ou plusieurs véhicules et détester un ou plusieurs fromages ...
Les tables d'associations contiennent donc une ou plusieurs lignes pour chaque utilisateur. Dans chaque table, ligne associe l'id_user avec un (ou plusieurs) id_couleur, id_vehicule et id_fromage.
Le code SQL est le suivant :
Jusqu'à là tout va bien ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 -- --- -- Table 'user' -- --- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL, `nom_user` VARCHAR(100) NULL DEFAULT NULL, PRIMARY KEY (`id`) ); -- --- -- Table 'couleur' -- --- DROP TABLE IF EXISTS `couleur`; CREATE TABLE `couleur` ( `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL, `nom_couleur` VARCHAR(100) NULL DEFAULT NULL, PRIMARY KEY (`id`) ); -- --- -- Table 'vehicule' -- --- DROP TABLE IF EXISTS `vehicule`; CREATE TABLE `vehicule` ( `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL, `nom_vehicule` VARCHAR(100) NULL DEFAULT NULL, PRIMARY KEY (`id`) ); -- --- -- Table 'fromage' -- --- DROP TABLE IF EXISTS `fromage`; CREATE TABLE `fromage` ( `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL, `nom_fromage` VARCHAR(100) NULL DEFAULT NULL, PRIMARY KEY (`id`) ); -- --- -- Table 'aime' -- --- DROP TABLE IF EXISTS `aime`; CREATE TABLE `aime` ( `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL, `id_user` TINYINT NULL DEFAULT NULL, `id_couleur` TINYINT NULL DEFAULT NULL, PRIMARY KEY (`id`) ); -- --- -- Table 'conduit' -- --- DROP TABLE IF EXISTS `conduit`; CREATE TABLE `conduit` ( `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL, `id_user` TINYINT NULL DEFAULT NULL, `id_vehicule` TINYINT NULL DEFAULT NULL, PRIMARY KEY (`id`) ); -- --- -- Table 'deteste' -- --- DROP TABLE IF EXISTS `deteste`; CREATE TABLE `deteste` ( `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL, `id_user` TINYINT NULL DEFAULT NULL, `id_fromage` TINYINT NULL DEFAULT NULL, PRIMARY KEY (`id`) ); -- --- -- Foreign Keys -- --- ALTER TABLE `aime` ADD FOREIGN KEY (id_user) REFERENCES `user` (`id`); ALTER TABLE `aime` ADD FOREIGN KEY (id_couleur) REFERENCES `couleur` (`id`); ALTER TABLE `conduit` ADD FOREIGN KEY (id_user) REFERENCES `user` (`id`); ALTER TABLE `conduit` ADD FOREIGN KEY (id_vehicule) REFERENCES `vehicule` (`id`); ALTER TABLE `deteste` ADD FOREIGN KEY (id_user) REFERENCES `user` (`id`); ALTER TABLE `deteste` ADD FOREIGN KEY (id_fromage) REFERENCES `fromage` (`id`); -- --- -- Test Data -- --- INSERT INTO `user` (`nom_user`) VALUES ('Marie'),('John'),('Robert'),('Stéphanie'); INSERT INTO `couleur` (`nom_couleur`) VALUES ('Bleu'),('Rouge'),('Vert'),('Marron'),('Jaune'),('Violet'); INSERT INTO `vehicule` (`nom_vehicule`) VALUES ('306'),('Mini'),('Vélib'),('F16'),('Ferrari'),('Porsche'); INSERT INTO `fromage` (`nom_fromage`) VALUES ('Camembert'),('Roquefort'),('Comté'),('Tome'),('Chèvre'); INSERT INTO `aime` (`id_user`,`id_couleur`) VALUES ('1','1'),('1','3'),('1','6'),('2','2'),('3','4'),('3','5'),('3','6'),('4','1'),('4','2'),('4','3'),('4','5'),('4','6'); INSERT INTO `conduit` (`id_user`,`id_vehicule`) VALUES ('1','4'),('1','2'),('2','1'),('2','2'),('2','5'),('2','6'),('3','3'),('3','4'),('4','2'),('4','3'),('4','5'),('4','6'); INSERT INTO `deteste` (`id_user`,`id_fromage`) VALUES ('1','1'),('1','2'),('1','3'),('1','4'),('1','5'),('2','5'),('3','1'),('3','5'),('4','1'),('4','2'),('4','3'),('4','4');
Maintenant la requête pour sélectionner l'utilisateur 3 (par exemple ROBERT) :
Super j'ai une belle réponse, mais une sacré réponse : 12 LIGNES !!!!!!! Une combinaison de chacune de ses associations :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT u.nom_user, c.nom_couleur, v.nom_vehicule, f.nom_fromage FROM user u INNER JOIN aime a ON a.id_user = u.id INNER JOIN conduit k ON k.id_user = u.id INNER JOIN deteste d ON d.id_user = u.id INNER JOIN couleur c ON c.id = a.id_couleur INNER JOIN vehicule v ON v.id = k.id_vehicule INNER JOIN fromage f ON f.id = d.id_fromage WHERE u.id =3
C'est génial sauf qu'en PHP je me retrouve avec un beau tableau comme celui-là :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Robert Marron Vélib Camembert Robert Jaune Vélib Camembert Robert Violet Vélib Camembert Robert Marron Vélib Chèvre Robert Jaune Vélib Chèvre Robert Violet Vélib Chèvre Robert Marron F16 Camembert Robert Jaune F16 Camembert Robert Violet F16 Camembert Robert Marron F16 Chèvre Robert Jaune F16 Chèvre Robert Violet F16 Chèvre
Le code php pour obtenir cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 Array ( [0] => Array ( [nom_user] => Robert [nom_couleur] => Marron [nom_vehicule] => Vélib [nom_fromage] => Camembert ) [1] => Array ( [nom_user] => Robert [nom_couleur] => Jaune [nom_vehicule] => Vélib [nom_fromage] => Camembert ) [2] => Array ( [nom_user] => Robert [nom_couleur] => Violet [nom_vehicule] => Vélib [nom_fromage] => Camembert ) [3] => Array ( [nom_user] => Robert [nom_couleur] => Marron [nom_vehicule] => Vélib [nom_fromage] => Chèvre ) [4] => Array ( [nom_user] => Robert [nom_couleur] => Jaune [nom_vehicule] => Vélib [nom_fromage] => Chèvre ) [5] => Array ( [nom_user] => Robert [nom_couleur] => Violet [nom_vehicule] => Vélib [nom_fromage] => Chèvre ) [6] => Array ( [nom_user] => Robert [nom_couleur] => Marron [nom_vehicule] => F16 [nom_fromage] => Camembert ) [7] => Array ( [nom_user] => Robert [nom_couleur] => Jaune [nom_vehicule] => F16 [nom_fromage] => Camembert ) [8] => Array ( [nom_user] => Robert [nom_couleur] => Violet [nom_vehicule] => F16 [nom_fromage] => Camembert ) [9] => Array ( [nom_user] => Robert [nom_couleur] => Marron [nom_vehicule] => F16 [nom_fromage] => Chèvre ) [10] => Array ( [nom_user] => Robert [nom_couleur] => Jaune [nom_vehicule] => F16 [nom_fromage] => Chèvre ) [11] => Array ( [nom_user] => Robert [nom_couleur] => Violet [nom_vehicule] => F16 [nom_fromage] => Chèvre ) )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 <?php include('Database.php'); //Web: http://www.ricocheting.com/ define('DB_SERVER', 'localhost'); define('DB_USER', 'root'); define('DB_PASS', 'monmotdepasse'); define('DB_DATABASE', 'plop'); $db = new Database(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE); $db->connect(); $sql = "select u.nom_user,c.nom_couleur,v.nom_vehicule,f.nom_fromage from user u\n" . "inner join aime a on a.id_user=u.id\n" . "inner join conduit k on k.id_user=u.id\n" . "inner join deteste d on d.id_user=u.id\n" . "inner join couleur c on c.id=a.id_couleur\n" . "inner join vehicule v on v.id=k.id_vehicule\n" . "inner join fromage f on f.id=d.id_fromage\n" . "where u.id=3"; print_r($db->fetch_all_array($sql)); ?>
Y'a-t-il moyen d'obtenir, à l'aide de mysql ou php, un tableau avec UNE SEULE LIGNE ? :
Si je dois traiter le premier tableau à l'aide d'un algorithme en PHP, j'ai peur que la complexité et le nombre de ligne dans la table fasse que le traitement soit vraiment lourd et peu optimisé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Array ( [0] => Array ( [nom_user] => Robert [nom_couleur] => Array ( [0] => Marron [1] => Jaune [2] => Violet ) [nom_vehicule] => Array ( [0] => Vélib [1] => F16 ) [nom_fromage] => Array ( [0] => Chèvre [1] => Camembert ) ) )
Je me dis aussi que je dois pas être le premier à tomber sur un cas pareil et qu'une fonction (en PHP) ou requête m'a échappée ...
J'ai essayé de documenter ce post le plus possible pour que si d'autre se pose la question, il trouve la réponse ici (si bien sûr l'un d'entre vous veuille bien se pencher sur le sujet)
D'avance merci de m'avoir lu et de vos réponses
Partager