À l'école de musique

[30 min]

Une école de musique souhaite gérer les inscriptions aux différentes classes d'instrument et aux orchestres à l'aide d'une base de données.

Schéma conceptuel
1
Famille (#nom:chaîne)
2
Instrument (#lib:chaîne, lib_long:chaîne, famille=>Famille(nom))
3
Professeur (#num:entier, nom:chaîne, prénom:chaîne, tâche:chaîne)
4
Eleve (#num:entier, nom:chaîne, prénom:chaîne, date_naissance:date, inst=>Instrument(lib))
5
Orchestre (#lib:chaîne, min:entier, max:entier)
6
Enseigne (#num=>Professeur(num), #lib=>Instrument(lib))
7
Participe (#num=>Eleve(num), #lib=>Orchestre(lib))

Question

Créer la base de données permettant de gérer les élèves et les instruments (sans les familles). Insérer des données exemple.

Solution

1
CREATE TABLE instrument (
2
lib VARCHAR PRIMARY KEY,
3
lib_long VARCHAR
4
);
5
6
CREATE TABLE eleve (
7
num INTEGER PRIMARY KEY,
8
nom VARCHAR NOT NULL,
9
prenom VARCHAR,
10
date_naissance DATE,
11
inst VARCHAR REFERENCES instrument(lib)
12
);
13
14
INSERT INTO instrument (lib) VALUES ('Violon');
15
INSERT INTO instrument (lib) VALUES ('Guitare');
16
17
INSERT INTO eleve (num, nom, inst) VALUES (1, 'Jimmy', 'Guitare');
18
INSERT INTO eleve (num, nom, inst) VALUES (2, 'Robby', 'Guitare');

Question

Écrire le code SQL qui permet d'afficher la liste des élèves (nom et prénom) triés par instrument.

Solution

1
SELECT E.nom, E.prenom, E.inst 
2
FROM Eleve E 
3
ORDER BY E.inst ;

Question

Écrire le code SQL qui permet d'afficher la liste des instruments avec le nombre d'élèves associés (on affichera même les instruments dont personne ne joue).

Solution

1
SELECT I.lib, COUNT(E.inst)
2
FROM Instrument I LEFT JOIN Eleve E ON E.inst=I.lib
3
GROUP BY lib ;

Question

Écrire le code SQL qui permet d'afficher la liste des instruments avec le nombre de places restantes par instruments, sachant qu'il y a 20 places disponibles par instrument.

Solution

1
SELECT I.lib, 20 - COUNT(E.inst)
2
FROM Instrument I LEFT JOIN Eleve E ON E.inst=I.lib
3
GROUP BY lib ;

Question

Compléter le code PHP ci-dessous pour afficher le nombre de places disponibles par instruments listés par leur libellé long.

On utilisera une requête paramétrée.

1
<html xmlns="http://www.w3.org/1999/xhtml">
2
	<head>
3
		<title>École de musique</title>
4
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5
	</head>
6
	
7
	<body>
8
	<h2>Liste des places disponibles par instrument</h2>
9
	<table border="1">
10
	<tr> <td><b>Instruments</b></td> <td><b>Places disponibles</b></td> </tr>
11
	
12
	<?php
13
	/* Nombre maximum d'élèves autorisé par instrument */
14
    $max_eleves = 20; 
15
    
16
    /* Nombre maximum d'élèves autorisé par instrument */
17
    $connexion = new PDO('pgsql:host=localhost;port=5432;dbname=musique', 'me', 'mypassword');	
18
    
19
    /** Préparation et exécution de la requête **/
20
    $sql = "SELECT I.lib AS lib, ? - COUNT(E.inst) AS dispo ...";
21
    $resultset = $connexion->prepare($sql);
22
    $resultset->bindParam(1, ...);
23
    $resultset->execute();            
24
        
25
    while ($row = $resultset->fetch(PDO::FETCH_ASSOC)) {
26
        echo "<tr>";
27
        echo "<td>" . $row[...] . "</td>";
28
        echo "<td>" . $row[...] . "</td>";
29
        echo "</tr>";
30
        }
31
        
32
    /** Déconnexion **/
33
    $connexion=null;    
34
    ?>
35
    
36
    </table>
37
    </body>
38
</html>

Solution

1
<html xmlns="http://www.w3.org/1999/xhtml">
2
	<head>
3
		<title>École de musique</title>
4
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5
	</head>
6
	
7
	<body>
8
	<h2>Liste des places disponibles par instrument</h2>
9
	<table border="1">
10
	<tr> <td><b>Instruments</b></td> <td><b>Places disponibles</b></td> </tr>
11
	
12
	<?php
13
	/* Nombre maximum d'élèves autorisé par instrument */
14
    $max_eleves = 20; 
15
    
16
    /* Nombre maximum d'élèves autorisé par instrument */
17
    $connexion = new PDO('pgsql:host=localhost;port=5432;dbname=musique', 'me', 'mypassword');	
18
    
19
    /** Préparation et exécution de la requête **/
20
    $sql = "SELECT I.lib AS lib, ? - COUNT(E.inst) AS dispo 
21
            FROM Instrument I LEFT JOIN Eleve E ON E.inst=I.lib 
22
            GROUP BY lib";
23
    $resultset = $connexion->prepare($sql);
24
    $resultset->bindParam(1, $max_eleves);
25
    $resultset->execute();            
26
        
27
    while ($row = $resultset->fetch(PDO::FETCH_ASSOC)) {
28
        echo "<tr>";
29
        echo "<td>" . $row['lib'] . "</td>";
30
        echo "<td>" . $row['dispo'] . "</td>";
31
        echo "</tr>";
32
        }
33
        
34
    /** Déconnexion **/
35
    $connexion=null;    
36
    ?>
37
    
38
    </table>
39
    </body>
40
</html>