Bonjour,
Je suis actuellement en train de programmer une petite application web en PHP s'appuyant sur MySQL pour gérer mes entraînements.
Voici les instructions MySQL de création de ma base de données :
CREATE TABLE `means` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`label` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `processes` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`label` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `trainings` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`date` date NOT NULL,
`time` time NOT NULL,
`description` varchar(200) NOT NULL,
`observations` varchar(200) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `training_parts` (
`training` smallint(5) unsigned NOT NULL,
`part` tinyint(3) unsigned NOT NULL,
`means` tinyint(3) unsigned NOT NULL,
`process` tinyint(3) unsigned NOT NULL,
`duration` time NOT NULL,
`complement` varchar(70) NOT NULL,
PRIMARY KEY (`training`,`part`),
KEY `means` (`means`),
KEY `process` (`process`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
les contraintes :
ALTER TABLE `training_parts`
ADD CONSTRAINT `training_parts_ibfk_1` FOREIGN KEY (`training`) REFERENCES `trainings` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `training_parts_ibfk_2` FOREIGN KEY (`means`) REFERENCES `means` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
ADD CONSTRAINT `training_parts_ibfk_3` FOREIGN KEY (`process`) REFERENCES `processes` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE;
et les instructions de peuplement de la base :
INSERT INTO `means` (`id`, `label`) VALUES
(1, 'Ski classic'),
(2, 'Ski skating'),
(3, 'Rollerski classic'),
(4, 'Rollerski skating'),
(5, 'Course à pied'),
(6, 'Vélo tout terrain'),
(7, 'Marche'),
(8, 'Vélo de route'),
(9, 'Musculation'),
(10, 'Sports collectifs'),
(11, 'Autres');
INSERT INTO `processes` (`id`, `label`) VALUES
(1, 'Allure 0'),
(2, 'Allure 1'),
(3, 'Allure 2'),
(4, 'Allure 3'),
(5, 'Allure 4'),
(6, 'Allure 5');
INSERT INTO `trainings` (`id`, `date`, `time`, `description`, `observations`) VALUES
(1, '2007-05-06', '09:30:00', '', ''),
(2, '2007-05-08', '17:00:00', '', ''),
(3, '2007-05-10', '10:15:00', '', ''),
(4, '2007-05-12', '14:15:00', '', ''),
(5, '2007-05-13', '09:15:00', '', ''),
(6, '2007-05-14', '16:30:00', 'Mini séance d''orientation', ''),
(7, '2007-05-15', '17:15:00', '', ''),
(8, '2007-05-16', '11:15:00', '', ''),
(9, '2007-05-16', '16:30:00', '', ''),
(10, '2007-05-17', '16:00:00', '', ''),
(11, '2007-05-19', '14:30:00', '', ''),
(12, '2007-05-20', '10:30:00', '', ''),
(13, '2007-05-22', '18:30:00', '', ''),
(14, '2007-05-23', '10:30:00', '', ''),
(15, '2007-05-26', '14:30:00', '', ''),
(16, '2007-05-27', '09:15:00', '', ''),
(17, '2007-05-28', '11:15:00', '', ''),
(18, '2007-05-30', '15:45:00', '', ''),
(19, '2007-05-31', '15:15:00', '', ''),
(20, '2007-05-31', '17:30:00', '', ''),
(21, '2007-06-02', '14:30:00', '', ''),
(22, '2007-06-03', '09:15:00', '', ''),
(23, '2007-06-03', '16:45:00', '', ''),
(24, '2007-06-04', '10:45:00', '', '');
INSERT INTO `training_parts` (`training`, `part`, `means`, `process`, `duration`, `complement`) VALUES
(1, 1, 8, 2, '02:10:00', ''),
(2, 1, 6, 2, '01:15:00', ''),
(3, 1, 8, 2, '02:15:00', ''),
(4, 1, 10, 6, '01:30:00', 'Football'),
(5, 1, 8, 2, '02:20:00', ''),
(6, 1, 5, 2, '00:25:00', ''),
(6, 2, 7, 2, '00:15:00', ''),
(7, 1, 10, 6, '00:35:00', 'Football'),
(8, 1, 10, 6, '00:45:00', 'Football'),
(9, 1, 10, 6, '00:35:00', 'Football'),
(9, 2, 9, 6, '00:20:00', '2 x (Exercices de gainage et exercices de bras)'),
(10, 1, 10, 6, '01:00:00', 'Football'),
(11, 1, 6, 2, '02:35:00', ''),
(12, 1, 8, 2, '03:05:00', ''),
(13, 1, 5, 2, '01:05:00', ''),
(14, 1, 10, 6, '01:00:00', 'Football'),
(15, 1, 7, 2, '00:30:00', ''),
(15, 2, 10, 6, '00:45:00', 'Football'),
(16, 1, 5, 2, '01:35:00', ''),
(17, 1, 5, 2, '01:30:00', ''),
(18, 1, 6, 2, '02:05:00', ''),
(19, 1, 5, 2, '01:45:00', ''),
(20, 1, 9, 4, '00:25:00', '3 x (5''; 3'') d''exercices de bras et de gainage)'),
(21, 1, 6, 2, '01:05:00', ''),
(21, 2, 9, 6, '00:20:00', 'Exercices de bras et de gainage'),
(22, 1, 8, 2, '02:50:00', ''),
(23, 1, 5, 2, '01:20:00', ''),
(24, 1, 5, 2, '02:00:00', '');
Voici maintenant mon problème :
J'aimerais construire une table ayant pour intitulés de colonnes les valeurs du champ label de la table processes et comme intitulés de ligne les valeurs du champ label de la table means (en fait un tableau à double entrée) et contenant les durées totales d'entraînement par moyen/procédé.
Tout d'abord je me pose la question de savoir si cela est réalisable.
En effet j'arrive à obtenir une table avec les durées totales d'entraînement par moyen pour un procédé donné et peux donc réalisé le tableau souhaité mais cela suppose que la liste des procédés stockée dans la table procédés soit fixe or ce n'est pas le cas...
Quelqu'un aurait-il une idée pour résoudre mon problème le plus simplement possible (s'il est possible de faire cela sans l'aide de trigger ou de procédures stockées cela m'arrangerait ) ?
J'envisage autrement une autre solution : sortir les informations voulues dans un tableau à une dimension à l'aide de jointures gauches et de GROUP BY sur means et processes avec un WITH ROLLUP pour les totaux, et la remise en forme du tableau pour l'affichage à l'aide de PHP.
Mais avant de capituler je tiens à me creuser le cerveau jusqu'au bout grâce à votre aide
Merci d'avance.
Partager