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

MySQL Discussion :

Petit jeu / exercice de prog


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Par défaut Petit jeu / exercice de prog
    Bonjour,

    La boîte pour laquelle je bosse a créé un petit test de dev en PHP de manière à voir le niveau des stagiaires.

    Vu que j'avais fait un an dans un IUT info j'ai demandé à y avoir accès juste pour rire, et l'idée de piéger amicalement mes collègues m'a traversé l'esprit: leur retourner le test complété. Vu que je ne connais personne qui puisse le faire (je suis en marketing, on ne code pas des masses, le plus qu'on fasse est utiliser WordPress et vérifier le code...), je me suis dit que si certain d'entre vous avaient 20 minutes et voulaient participer à la blague, ça pourrait être marrant.

    Juste pour info, je ne compte pas m'approprier les réponses, je ne saurais probablement pas si ce que vous m'enverrez est juste ou pas, c'est vraiment pour faire une blague.

    Je copie/colle l'exercice:

    Merci

    Nicolas





    Test de développement PHP

    Problématique: Une prof souhaiterait informatiser la notation de ses élèves. Elle aimerait donc un système lui permettant d’ajouter des élèves et des matières, pour ensuite associer des notes à ces élèves. La prof aimerait disposer d’un tableau de bord par élève affichant la moyenne générale, la moyenne par matière, le nombre de note par matière et le classement de l’élève par rapport aux autres.

    Votre objectif est donc de réaliser ce système.

    Nomenclature:

    Élève:

    ● Prénom
    ● Nom
    ● Date de naissance

    Matière:

    ● Nom de la matière
    ● Coefficient de la matière

    Environnement technique: Le développement doit être fait en PHP, avec une base de données MySQL ou PostgreSQL. Vous êtes libre d’utiliser un framework pour la partie visuelle (Bootstrap, etc). Le rendu doit être fait dans un fichier compressé comprenant le code source ainsi qu’un export de la structure de la BDD. Toute amélioration est un plus (fonctionnalités supplémentaires, visuel et/ou ergonomie soigné, etc).

    Bon courage!

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 884
    Par défaut
    Salut Nicolas.

    Voici ce que je propose comme solution. Ce n'est qu'une première ébauche répondant à ton attente.
    Il faut le tester un peu plus afin de voir les défauts que l'on peut rencontrer.

    Je n'ai traité que la partie mysql car on se trouve dans le forum consacré à SGBDR.

    1) création de la base de données avec un petit jeu d'essai.
    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
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
     
    -- ======================
    -- Base de Données `base`
    -- ======================
     
    DROP DATABASE IF EXISTS `base`;
     
    CREATE DATABASE `base`
    	DEFAULT CHARACTER SET `latin1`
    	DEFAULT COLLATE       `latin1_general_ci`;
     
    USE `base`;
     
    -- =============
    -- Table `eleve`
    -- =============
     
    DROP TABLE IF EXISTS `eleve`;
     
    CREATE TABLE `eleve` (
      `eleve`     int unsigned NOT NULL PRIMARY KEY,
      `nom`       varchar(255) NOT NULL DEFAULT ' ',
      `prenom`    varchar(255) NOT NULL DEFAULT ' ',
      `Naissance` date         NOT NULL DEFAULT 0
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- ==============
    -- Insert `eleve`
    -- ==============
     
    insert into `eleve` (`eleve`,`nom`,`prenom`,`naissance`) values
      (1, 'Molard',   'Edgar',     '2015-01-01'),
      (2, 'Rateau',   'Ghislaine', '2015-03-01'),
      (3, 'Latouche', 'Gustave',   '2015-04-01'),
      (4, 'Gratin',   'Leonie',    '2015-05-01'),
      (5, 'Molasse',  'Marcel',    '2015-02-01');
     
    -- ===============
    -- Table `matiere`
    -- ===============
     
    DROP TABLE IF EXISTS `matiere`;
     
    CREATE TABLE `matiere` (
      `matiere`   int unsigned NOT NULL PRIMARY KEY,
      `libelle`   varchar(255) NOT NULL DEFAULT ' ',
      `coeff`     decimal(4,2) NOT NULL DEFAULT 0
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- ================
    -- Insert `matiere`
    -- ================
     
    insert into `matiere` (`matiere`,`libelle`,`coeff`) value
      (1, 'mathematique', 5),
      (2, 'francais',     3),
      (3, 'histoire',     2),
      (4, 'philosophie',  4);
     
    -- ============
    -- Table `note`
    -- ============
     
    DROP TABLE IF EXISTS `note`;
     
    create table `note` (
      `id`       int unsigned NOT NULL PRIMARY KEY,
      `eleve`    int unsigned NOT NULL,
      `matiere`  int unsigned NOT NULL,
      `note`     decimal(4,2) NOT NULL,
      CONSTRAINT FOREIGN KEY (`eleve`)
    	REFERENCES `eleve`   (`eleve`)
    	ON UPDATE CASCADE
    	ON DELETE cascade,
      CONSTRAINT FOREIGN KEY (`matiere`)
    	REFERENCES `matiere` (`matiere`)
    	ON UPDATE CASCADE
    	ON DELETE cascade,
      INDEX `idx` (`matiere`,`id`,`eleve`)
     
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- =============
    -- Insert `note`
    -- =============
     
    insert into `note` (`id`,`eleve`,`matiere`,`note`) value 
      ( 1, 3, 1, 15.0),( 2, 3, 2, 07.5),( 3, 3, 2, 14.5),( 4, 3, 4, 12.5),
      ( 5, 5, 1, 13.5),( 6, 5, 3, 09.5),( 7, 5, 3, 07.5),( 8, 5, 4, 13.0),
      ( 9, 4, 1, 10.5),(10, 4, 2, 12.5),(11, 4, 3, 10.5),(12, 4, 1, 08.5),
      (13, 1, 4, 11.0),(14, 1, 2, 13.0),(15, 1, 3, 07.0),(16, 1, 4, 17.0),
      (17, 2, 1, 12.0),(18, 2, 2, 07.5),(19, 2, 3, 09.0),(20, 2, 4, 11.0)
    ;
     
    -- ===
    -- FIN
    -- ===
     
    COMMIT;
    SET AUTOCOMMIT = 1;
    2) j'ai répondu à tes quatre traitements :
    --> la moyenne générale par élève.
    --> la moyenne par élève et par matière.
    --> le nombre de note par matière et par élève.
    --> le classement général par élève.

    Pour obtenir les résultats, je suis passé par une table temporaire.
    Du coup, les requêtes sont plus simples !

    Le dernier 'select' traite la moyenne générale et le classement.
    L'avant dernier 'select' traite la moyenne par matière et le nombre de note ('nbre') par matière.
    Et voici la seconde partie. Je donne son exécution.
    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    --------------
    create temporary table `temp` (
    `nom`     varchar(255) NOT NULL,
    `prenom`  varchar(255) NOT NULL,
    `libelle` varchar(255) NOT NULL,
    `coeff`   decimal(5,2) NOT NULL,
    `note`    decimal(5,2) NOT NULL,
    `nbre`    int          NOT NULL,
    PRIMARY KEY (`nom`,`prenom`,`libelle`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    select t3.nom                  as 'nom',
           t3.prenom               as 'prenom',
           t1.libelle              as 'libelle',
           sum(t1.coeff)           as 'coeff',
           sum(t1.coeff * t2.note) as 'note',
           count(*)                as 'nbre'
    from       `matiere` as t1
    inner join `note`    as t2
    on (t2.matiere = t1.matiere)
    inner join `eleve`   as t3
    on (t3.eleve   = t2.eleve)
    group by t3.eleve, t1.matiere
    order by t3.nom, t3.prenom, t1.libelle
    --------------
     
    --------------
    select * from eleve
    --------------
     
    +-------+----------+-----------+------------+
    | eleve | nom      | prenom    | Naissance  |
    +-------+----------+-----------+------------+
    |     1 | Molard   | Edgar     | 2015-01-01 |
    |     2 | Rateau   | Ghislaine | 2015-03-01 |
    |     3 | Latouche | Gustave   | 2015-04-01 |
    |     4 | Gratin   | Leonie    | 2015-05-01 |
    |     5 | Molasse  | Marcel    | 2015-02-01 |
    +-------+----------+-----------+------------+
    --------------
    select * from matiere
    --------------
     
    +---------+--------------+-------+
    | matiere | libelle      | coeff |
    +---------+--------------+-------+
    |       1 | mathematique |  5.00 |
    |       2 | francais     |  3.00 |
    |       3 | histoire     |  2.00 |
    |       4 | philosophie  |  4.00 |
    +---------+--------------+-------+
    --------------
    select * from note
    --------------
     
    +----+-------+---------+-------+
    | id | eleve | matiere | note  |
    +----+-------+---------+-------+
    |  1 |     3 |       1 | 15.00 |
    |  2 |     3 |       2 |  7.50 |
    |  3 |     3 |       2 | 14.50 |
    |  4 |     3 |       4 | 12.50 |
    |  5 |     5 |       1 | 13.50 |
    |  6 |     5 |       3 |  9.50 |
    |  7 |     5 |       3 |  7.50 |
    |  8 |     5 |       4 | 13.00 |
    |  9 |     4 |       1 | 10.50 |
    | 10 |     4 |       2 | 12.50 |
    | 11 |     4 |       3 | 10.50 |
    | 12 |     4 |       1 |  8.50 |
    | 13 |     1 |       4 | 11.00 |
    | 14 |     1 |       2 | 13.00 |
    | 15 |     1 |       3 |  7.00 |
    | 16 |     1 |       4 | 17.00 |
    | 17 |     2 |       1 | 12.00 |
    | 18 |     2 |       2 |  7.50 |
    | 19 |     2 |       3 |  9.00 |
    | 20 |     2 |       4 | 11.00 |
    +----+-------+---------+-------+
    --------------
    select * from temp
    --------------
     
    +----------+-----------+--------------+-------+--------+------+
    | nom      | prenom    | libelle      | coeff | note   | nbre |
    +----------+-----------+--------------+-------+--------+------+
    | Gratin   | Leonie    | francais     |  3.00 |  37.50 |    1 |
    | Gratin   | Leonie    | histoire     |  2.00 |  21.00 |    1 |
    | Gratin   | Leonie    | mathematique | 10.00 |  95.00 |    2 |
    | Latouche | Gustave   | francais     |  6.00 |  66.00 |    2 |
    | Latouche | Gustave   | mathematique |  5.00 |  75.00 |    1 |
    | Latouche | Gustave   | philosophie  |  4.00 |  50.00 |    1 |
    | Molard   | Edgar     | francais     |  3.00 |  39.00 |    1 |
    | Molard   | Edgar     | histoire     |  2.00 |  14.00 |    1 |
    | Molard   | Edgar     | philosophie  |  8.00 | 112.00 |    2 |
    | Molasse  | Marcel    | histoire     |  4.00 |  34.00 |    2 |
    | Molasse  | Marcel    | mathematique |  5.00 |  67.50 |    1 |
    | Molasse  | Marcel    | philosophie  |  4.00 |  52.00 |    1 |
    | Rateau   | Ghislaine | francais     |  3.00 |  22.50 |    1 |
    | Rateau   | Ghislaine | histoire     |  2.00 |  18.00 |    1 |
    | Rateau   | Ghislaine | mathematique |  5.00 |  60.00 |    1 |
    | Rateau   | Ghislaine | philosophie  |  4.00 |  44.00 |    1 |
    +----------+-----------+--------------+-------+--------+------+
    --------------
    select nom, prenom, libelle, cast(sum(note)/sum(coeff) as decimal(4,2)) as 'moyenne', nbre
    from temp
    group by nom, prenom, libelle
    order by nom, prenom, libelle
    --------------
     
    +----------+-----------+--------------+---------+------+
    | nom      | prenom    | libelle      | moyenne | nbre |
    +----------+-----------+--------------+---------+------+
    | Gratin   | Leonie    | francais     |   12.50 |    1 |
    | Gratin   | Leonie    | histoire     |   10.50 |    1 |
    | Gratin   | Leonie    | mathematique |    9.50 |    2 |
    | Latouche | Gustave   | francais     |   11.00 |    2 |
    | Latouche | Gustave   | mathematique |   15.00 |    1 |
    | Latouche | Gustave   | philosophie  |   12.50 |    1 |
    | Molard   | Edgar     | francais     |   13.00 |    1 |
    | Molard   | Edgar     | histoire     |    7.00 |    1 |
    | Molard   | Edgar     | philosophie  |   14.00 |    2 |
    | Molasse  | Marcel    | histoire     |    8.50 |    2 |
    | Molasse  | Marcel    | mathematique |   13.50 |    1 |
    | Molasse  | Marcel    | philosophie  |   13.00 |    1 |
    | Rateau   | Ghislaine | francais     |    7.50 |    1 |
    | Rateau   | Ghislaine | histoire     |    9.00 |    1 |
    | Rateau   | Ghislaine | mathematique |   12.00 |    1 |
    | Rateau   | Ghislaine | philosophie  |   11.00 |    1 |
    +----------+-----------+--------------+---------+------+
    --------------
    select moyenne, nom, prenom, @i:=@i+1 as 'classement'
    from (
            select nom, prenom, cast(sum(note)/sum(coeff) as decimal(4,2)) as 'moyenne'
            from temp
            group by nom, prenom
            order by nom, prenom
    ) as x, (SELECT @i:=0) as y
    order by moyenne desc, nom, prenom
    --------------
     
    +---------+----------+-----------+------------+
    | moyenne | nom      | prenom    | classement |
    +---------+----------+-----------+------------+
    |   12.73 | Latouche | Gustave   |          1 |
    |   12.69 | Molard   | Edgar     |          2 |
    |   11.81 | Molasse  | Marcel    |          3 |
    |   10.32 | Rateau   | Ghislaine |          4 |
    |   10.23 | Gratin   | Leonie    |          5 |
    +---------+----------+-----------+------------+
     
    Appuyez sur une touche pour continuer...
    Il serait intéressant de confronter nos différentes solutions !

    @+

  3. #3
    Candidat au Club
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Par défaut Super, on verra ce que ça donne, merci :)
    Citation Envoyé par Artemus24 Voir le message
    Salut Nicolas.

    Voici ce que je propose comme solution. Ce n'est qu'une première ébauche répondant à ton attente.
    Il faut le tester un peu plus afin de voir les défauts que l'on peut rencontrer.

    Je n'ai traité que la partie mysql car on se trouve dans le forum consacré à SGBDR.

    1) création de la base de données avec un petit jeu d'essai.
    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
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
     
    -- ======================
    -- Base de Données `base`
    -- ======================
     
    DROP DATABASE IF EXISTS `base`;
     
    CREATE DATABASE `base`
    	DEFAULT CHARACTER SET `latin1`
    	DEFAULT COLLATE       `latin1_general_ci`;
     
    USE `base`;
     
    -- =============
    -- Table `eleve`
    -- =============
     
    DROP TABLE IF EXISTS `eleve`;
     
    CREATE TABLE `eleve` (
      `eleve`     int unsigned NOT NULL PRIMARY KEY,
      `nom`       varchar(255) NOT NULL DEFAULT ' ',
      `prenom`    varchar(255) NOT NULL DEFAULT ' ',
      `Naissance` date         NOT NULL DEFAULT 0
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- ==============
    -- Insert `eleve`
    -- ==============
     
    insert into `eleve` (`eleve`,`nom`,`prenom`,`naissance`) values
      (1, 'Molard',   'Edgar',     '2015-01-01'),
      (2, 'Rateau',   'Ghislaine', '2015-03-01'),
      (3, 'Latouche', 'Gustave',   '2015-04-01'),
      (4, 'Gratin',   'Leonie',    '2015-05-01'),
      (5, 'Molasse',  'Marcel',    '2015-02-01');
     
    -- ===============
    -- Table `matiere`
    -- ===============
     
    DROP TABLE IF EXISTS `matiere`;
     
    CREATE TABLE `matiere` (
      `matiere`   int unsigned NOT NULL PRIMARY KEY,
      `libelle`   varchar(255) NOT NULL DEFAULT ' ',
      `coeff`     decimal(4,2) NOT NULL DEFAULT 0
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- ================
    -- Insert `matiere`
    -- ================
     
    insert into `matiere` (`matiere`,`libelle`,`coeff`) value
      (1, 'mathematique', 5),
      (2, 'francais',     3),
      (3, 'histoire',     2),
      (4, 'philosophie',  4);
     
    -- ============
    -- Table `note`
    -- ============
     
    DROP TABLE IF EXISTS `note`;
     
    create table `note` (
      `id`       int unsigned NOT NULL PRIMARY KEY,
      `eleve`    int unsigned NOT NULL,
      `matiere`  int unsigned NOT NULL,
      `note`     decimal(4,2) NOT NULL,
      CONSTRAINT FOREIGN KEY (`eleve`)
    	REFERENCES `eleve`   (`eleve`)
    	ON UPDATE CASCADE
    	ON DELETE cascade,
      CONSTRAINT FOREIGN KEY (`matiere`)
    	REFERENCES `matiere` (`matiere`)
    	ON UPDATE CASCADE
    	ON DELETE cascade,
      INDEX `idx` (`matiere`,`id`,`eleve`)
     
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- =============
    -- Insert `note`
    -- =============
     
    insert into `note` (`id`,`eleve`,`matiere`,`note`) value 
      ( 1, 3, 1, 15.0),( 2, 3, 2, 07.5),( 3, 3, 2, 14.5),( 4, 3, 4, 12.5),
      ( 5, 5, 1, 13.5),( 6, 5, 3, 09.5),( 7, 5, 3, 07.5),( 8, 5, 4, 13.0),
      ( 9, 4, 1, 10.5),(10, 4, 2, 12.5),(11, 4, 3, 10.5),(12, 4, 1, 08.5),
      (13, 1, 4, 11.0),(14, 1, 2, 13.0),(15, 1, 3, 07.0),(16, 1, 4, 17.0),
      (17, 2, 1, 12.0),(18, 2, 2, 07.5),(19, 2, 3, 09.0),(20, 2, 4, 11.0)
    ;
     
    -- ===
    -- FIN
    -- ===
     
    COMMIT;
    SET AUTOCOMMIT = 1;
    2) j'ai répondu à tes quatre traitements :
    --> la moyenne générale par élève.
    --> la moyenne par élève et par matière.
    --> le nombre de note par matière et par élève.
    --> le classement général par élève.

    Pour obtenir les résultats, je suis passé par une table temporaire.
    Du coup, les requêtes sont plus simples !

    Le dernier 'select' traite la moyenne générale et le classement.
    L'avant dernier 'select' traite la moyenne par matière et le nombre de note ('nbre') par matière.
    Et voici la seconde partie. Je donne son exécution.
    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    --------------
    create temporary table `temp` (
    `nom`     varchar(255) NOT NULL,
    `prenom`  varchar(255) NOT NULL,
    `libelle` varchar(255) NOT NULL,
    `coeff`   decimal(5,2) NOT NULL,
    `note`    decimal(5,2) NOT NULL,
    `nbre`    int          NOT NULL,
    PRIMARY KEY (`nom`,`prenom`,`libelle`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    select t3.nom                  as 'nom',
           t3.prenom               as 'prenom',
           t1.libelle              as 'libelle',
           sum(t1.coeff)           as 'coeff',
           sum(t1.coeff * t2.note) as 'note',
           count(*)                as 'nbre'
    from       `matiere` as t1
    inner join `note`    as t2
    on (t2.matiere = t1.matiere)
    inner join `eleve`   as t3
    on (t3.eleve   = t2.eleve)
    group by t3.eleve, t1.matiere
    order by t3.nom, t3.prenom, t1.libelle
    --------------
     
    --------------
    select * from eleve
    --------------
     
    +-------+----------+-----------+------------+
    | eleve | nom      | prenom    | Naissance  |
    +-------+----------+-----------+------------+
    |     1 | Molard   | Edgar     | 2015-01-01 |
    |     2 | Rateau   | Ghislaine | 2015-03-01 |
    |     3 | Latouche | Gustave   | 2015-04-01 |
    |     4 | Gratin   | Leonie    | 2015-05-01 |
    |     5 | Molasse  | Marcel    | 2015-02-01 |
    +-------+----------+-----------+------------+
    --------------
    select * from matiere
    --------------
     
    +---------+--------------+-------+
    | matiere | libelle      | coeff |
    +---------+--------------+-------+
    |       1 | mathematique |  5.00 |
    |       2 | francais     |  3.00 |
    |       3 | histoire     |  2.00 |
    |       4 | philosophie  |  4.00 |
    +---------+--------------+-------+
    --------------
    select * from note
    --------------
     
    +----+-------+---------+-------+
    | id | eleve | matiere | note  |
    +----+-------+---------+-------+
    |  1 |     3 |       1 | 15.00 |
    |  2 |     3 |       2 |  7.50 |
    |  3 |     3 |       2 | 14.50 |
    |  4 |     3 |       4 | 12.50 |
    |  5 |     5 |       1 | 13.50 |
    |  6 |     5 |       3 |  9.50 |
    |  7 |     5 |       3 |  7.50 |
    |  8 |     5 |       4 | 13.00 |
    |  9 |     4 |       1 | 10.50 |
    | 10 |     4 |       2 | 12.50 |
    | 11 |     4 |       3 | 10.50 |
    | 12 |     4 |       1 |  8.50 |
    | 13 |     1 |       4 | 11.00 |
    | 14 |     1 |       2 | 13.00 |
    | 15 |     1 |       3 |  7.00 |
    | 16 |     1 |       4 | 17.00 |
    | 17 |     2 |       1 | 12.00 |
    | 18 |     2 |       2 |  7.50 |
    | 19 |     2 |       3 |  9.00 |
    | 20 |     2 |       4 | 11.00 |
    +----+-------+---------+-------+
    --------------
    select * from temp
    --------------
     
    +----------+-----------+--------------+-------+--------+------+
    | nom      | prenom    | libelle      | coeff | note   | nbre |
    +----------+-----------+--------------+-------+--------+------+
    | Gratin   | Leonie    | francais     |  3.00 |  37.50 |    1 |
    | Gratin   | Leonie    | histoire     |  2.00 |  21.00 |    1 |
    | Gratin   | Leonie    | mathematique | 10.00 |  95.00 |    2 |
    | Latouche | Gustave   | francais     |  6.00 |  66.00 |    2 |
    | Latouche | Gustave   | mathematique |  5.00 |  75.00 |    1 |
    | Latouche | Gustave   | philosophie  |  4.00 |  50.00 |    1 |
    | Molard   | Edgar     | francais     |  3.00 |  39.00 |    1 |
    | Molard   | Edgar     | histoire     |  2.00 |  14.00 |    1 |
    | Molard   | Edgar     | philosophie  |  8.00 | 112.00 |    2 |
    | Molasse  | Marcel    | histoire     |  4.00 |  34.00 |    2 |
    | Molasse  | Marcel    | mathematique |  5.00 |  67.50 |    1 |
    | Molasse  | Marcel    | philosophie  |  4.00 |  52.00 |    1 |
    | Rateau   | Ghislaine | francais     |  3.00 |  22.50 |    1 |
    | Rateau   | Ghislaine | histoire     |  2.00 |  18.00 |    1 |
    | Rateau   | Ghislaine | mathematique |  5.00 |  60.00 |    1 |
    | Rateau   | Ghislaine | philosophie  |  4.00 |  44.00 |    1 |
    +----------+-----------+--------------+-------+--------+------+
    --------------
    select nom, prenom, libelle, cast(sum(note)/sum(coeff) as decimal(4,2)) as 'moyenne', nbre
    from temp
    group by nom, prenom, libelle
    order by nom, prenom, libelle
    --------------
     
    +----------+-----------+--------------+---------+------+
    | nom      | prenom    | libelle      | moyenne | nbre |
    +----------+-----------+--------------+---------+------+
    | Gratin   | Leonie    | francais     |   12.50 |    1 |
    | Gratin   | Leonie    | histoire     |   10.50 |    1 |
    | Gratin   | Leonie    | mathematique |    9.50 |    2 |
    | Latouche | Gustave   | francais     |   11.00 |    2 |
    | Latouche | Gustave   | mathematique |   15.00 |    1 |
    | Latouche | Gustave   | philosophie  |   12.50 |    1 |
    | Molard   | Edgar     | francais     |   13.00 |    1 |
    | Molard   | Edgar     | histoire     |    7.00 |    1 |
    | Molard   | Edgar     | philosophie  |   14.00 |    2 |
    | Molasse  | Marcel    | histoire     |    8.50 |    2 |
    | Molasse  | Marcel    | mathematique |   13.50 |    1 |
    | Molasse  | Marcel    | philosophie  |   13.00 |    1 |
    | Rateau   | Ghislaine | francais     |    7.50 |    1 |
    | Rateau   | Ghislaine | histoire     |    9.00 |    1 |
    | Rateau   | Ghislaine | mathematique |   12.00 |    1 |
    | Rateau   | Ghislaine | philosophie  |   11.00 |    1 |
    +----------+-----------+--------------+---------+------+
    --------------
    select moyenne, nom, prenom, @i:=@i+1 as 'classement'
    from (
            select nom, prenom, cast(sum(note)/sum(coeff) as decimal(4,2)) as 'moyenne'
            from temp
            group by nom, prenom
            order by nom, prenom
    ) as x, (SELECT @i:=0) as y
    order by moyenne desc, nom, prenom
    --------------
     
    +---------+----------+-----------+------------+
    | moyenne | nom      | prenom    | classement |
    +---------+----------+-----------+------------+
    |   12.73 | Latouche | Gustave   |          1 |
    |   12.69 | Molard   | Edgar     |          2 |
    |   11.81 | Molasse  | Marcel    |          3 |
    |   10.32 | Rateau   | Ghislaine |          4 |
    |   10.23 | Gratin   | Leonie    |          5 |
    +---------+----------+-----------+------------+
     
    Appuyez sur une touche pour continuer...
    Il serait intéressant de confronter nos différentes solutions !

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide pour concevoir un petit jeu en C
    Par samy100 dans le forum Projets
    Réponses: 11
    Dernier message: 30/10/2019, 11h22
  2. Petit jeu multijoueur en ligne (commençons simple lol)
    Par Archaoniro dans le forum Langage
    Réponses: 25
    Dernier message: 24/03/2006, 18h31
  3. Petit jeu en java
    Par Seth77 dans le forum 2D
    Réponses: 80
    Dernier message: 08/01/2006, 23h01
  4. Nombre aléatoire (petit jeu)
    Par niCo.nb dans le forum C
    Réponses: 7
    Dernier message: 14/10/2005, 19h55

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