IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête SQL et tableau à double entrée


Sujet :

Langage SQL

  1. #1
    Invité
    Invité(e)
    Par défaut Requête SQL et tableau à double entrée
    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.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 098
    Points : 28 406
    Points
    28 406
    Par défaut
    Citation Envoyé par Geek87
    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.
    Cette solution est la bonne...
    Sinon, pour faire un tableau à double entrée, il faudrait une structure de requêtes dynamiques complexe... et le langage SQL n'est pas conçu pour faire de la mise en forme de données.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 847
    Points : 52 955
    Points
    52 955
    Billets dans le blog
    6
    Par défaut
    petites remarques :
    les colonnes dans les tables ne doivent jamais porter le même nom,sauf si ce sont des clefs étrangères.
    Exemple id partout à virer et mettre means_id, process_id

    je ne voit pas les clefs étrangères dans ta table trainings parts...

    Enfin, tu peut faire un CROSS JOIN des tables means, process et training et remplir les cas qui t'intéresse avec la table de jointure.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Merci pour ces réponses.

    -> al1_24

    C'est ce qu'il me semble aussi mais je veux en être certain.

    -> SQLpro

    Je vais de ce pas changer les noms de mes colonnes.

    Pour les clés étrangères, je pense que c'est la façon de faire de MySQL, les contraintes sont indiquées en dehors des définitions de table (voir la section contraintes de mon premier message).

    Par contre pouvez vous préciser la solution du CROSS JOIN parce que je ne comprends pas trop "remplir les cas qui m'intéressent avec la table de jointure" ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je viens d'aller faire un tour dans phpMyAdmin et la requête aurait effectivement pu être écrite de cette façon (en gardant les noms utilisés jusque là) :

    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`),
    FOREIGN KEY (`training`) REFERENCES `trainings` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (`means`) REFERENCES `means` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
    FOREIGN KEY (`process`) REFERENCES `processes` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    La forme décrite dans le premier message est celle de l'outil d'export de table de phpMyAdmin.

Discussions similaires

  1. [SQL] Tableau double entrée / Requête
    Par Sekigawa dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 19/03/2008, 12h59
  2. tableau double entrée et requete sql
    Par oceane751 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 29/11/2005, 14h25
  3. [MySQL] Tableau double entrée et requete sql
    Par oceane751 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 28/11/2005, 09h07
  4. tableau double entrée
    Par Andrey dans le forum C
    Réponses: 16
    Dernier message: 08/11/2005, 15h33
  5. [XSLT]tableau double entrée avec cellule manquante
    Par nferay dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 08/03/2005, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo