Pour construire la base de données relationnelle je dois reformuler le besoin :... une chanson ...
... l'artiste qui a interprété une chanson (ils peuvent être plusiuers à avoir interprété la chanson et il peut y avoir des duos aussi)...
... l'émission dans laquelle il l'a interprétée.
-- phpMyAdmin SQL Dump
-- version 2.7.0-pl1
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Mercredi 15 Février 2006 à 09:46
-- Version du serveur: 5.0.17
-- Version de PHP: 5.1.1
--
-- Base de données: `artistes_chansons`
--
CREATE DATABASE `artistes_chansons` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE artistes_chansons;
-- --------------------------------------------------------
--
-- Structure de la table `artiste`
--
CREATE TABLE `artiste` (
`id` int(11) NOT NULL auto_increment,
`nom` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `nom` (`nom`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
--
-- Contenu de la table `artiste`
--
INSERT INTO `artiste` (`id`, `nom`) VALUES (4, 'Bix BEIDERBECKE');
INSERT INTO `artiste` (`id`, `nom`) VALUES (5, 'Don VOORHEES');
INSERT INTO `artiste` (`id`, `nom`) VALUES (7, 'JOHNTONE');
INSERT INTO `artiste` (`id`, `nom`) VALUES (6, 'LAYTON');
INSERT INTO `artiste` (`id`, `nom`) VALUES (3, 'Paul WHITEMAN');
-- --------------------------------------------------------
--
-- Structure de la table `chanson`
--
CREATE TABLE `chanson` (
`id` int(11) NOT NULL auto_increment,
`nom` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `nom` (`nom`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
--
-- Contenu de la table `chanson`
--
INSERT INTO `chanson` (`id`, `nom`) VALUES (2, 'Clementine From New Orleans');
INSERT INTO `chanson` (`id`, `nom`) VALUES (1, 'Ol Man River');
-- --------------------------------------------------------
--
-- Structure de la table `emission`
--
CREATE TABLE `emission` (
`id` int(11) NOT NULL auto_increment,
`nom` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `nom` (`nom`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
--
-- Contenu de la table `emission`
--
INSERT INTO `emission` (`id`, `nom`) VALUES (1, 'Black & Blue');
INSERT INTO `emission` (`id`, `nom`) VALUES (2, 'Chanson - Boum !');
INSERT INTO `emission` (`id`, `nom`) VALUES (5, 'LES CINGLES DU MUSIC-HALL (1782)');
-- --------------------------------------------------------
--
-- Structure de la table `interpretation`
--
CREATE TABLE `interpretation` (
`lieu` varchar(100) NOT NULL,
`date` datetime NOT NULL,
`id_emission` int(11) NOT NULL,
`id_chanson` int(11) NOT NULL,
`id_artiste` int(11) NOT NULL,
PRIMARY KEY (`date`,`id_emission`,`id_chanson`,`id_artiste`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Contenu de la table `interpretation`
--
INSERT INTO `interpretation` (`lieu`, `date`, `id_emission`, `id_chanson`, `id_artiste`) VALUES ('New York', '1927-09-10 00:00:00', 5, 2, 5);
INSERT INTO `interpretation` (`lieu`, `date`, `id_emission`, `id_chanson`, `id_artiste`) VALUES ('New York', '1928-01-07 00:00:00', 5, 1, 3);
INSERT INTO `interpretation` (`lieu`, `date`, `id_emission`, `id_chanson`, `id_artiste`) VALUES ('New York', '1928-01-07 00:00:00', 5, 1, 5);
INSERT INTO `interpretation` (`lieu`, `date`, `id_emission`, `id_chanson`, `id_artiste`) VALUES ('Londres', '1928-05-10 00:00:00', 5, 1, 6);
INSERT INTO `interpretation` (`lieu`, `date`, `id_emission`, `id_chanson`, `id_artiste`) VALUES ('Londres', '1928-05-10 00:00:00', 5, 1, 7);
INSERT INTO `interpretation` (`lieu`, `date`, `id_emission`, `id_chanson`, `id_artiste`) VALUES ('Chicago', '1928-07-07 00:00:00', 5, 1, 4);
Liste des interprétations par émission:
SELECT e.nom, date, lieu, c.nom, a.nom
FROM interpretation as i , emission as e, chanson as c, artiste as a
WHERE i.id_artiste = a.id
AND i.id_chanson = c.id
AND i.id_emission = e.id
ORDER BY e.nom, date, lieu, c.nom, a.nom
Comme on le voit ici le WHERE s'occupe principalement des relations entre les tables.SELECT id_emission, date, lieu, id_chanson, if (count(id_artiste) <2 , "Single" , "Duo") as type
FROM interpretation
GROUP BY id_emission, date, lieu, id_chanson
Cette requête ne permet pas d'avoir accès aux artistes, puisqu'il y a un regroupement par chanson. Le cas des Duo le démontre.SELECT e.nom, i.date, i.lieu, c.nom, types.type, (SELECT nom FROM artiste WHERE i.id_artiste = id) AS nom_artiste
FROM (
SELECT id_emission, date, lieu, id_chanson, if( count( id_artiste ) <2, "Single", "Duo" ) AS TYPE
FROM interpretation
GROUP BY id_emission, date, lieu, id_chanson
) AS TYPES ,
interpretation AS i, emission as e, chanson as c
WHERE types.type = "Duo"
AND i.id_emission = types.id_emission
AND i.date = types.date
AND i.id_chanson = types.id_chanson
AND i.id_emission = e.id
AND i.id_chanson = c.id
La sous-requête "(SELECT nom FROM artiste WHERE i.id_artiste = id) AS nom_artiste" qui se trouve dans le SELECT
<?php
//Requête qui extrait les DUO d'une chanson donnée par $id_chanson
$id_chanson = $_GET[id_chanson]; //source de l'id_chanson ciblé
if (!$id_chanson) {echo "<p>Aucune chanson n'est sélectionnée!"; exit;}
$sql = "
SELECT i.id_emission, e.nom, i.date, (SELECT nom FROM artiste WHERE i.id_artiste = id) AS nom_artiste
FROM (
SELECT id_emission, date, id_chanson, if( count( id_artiste ) <2, 'Single', 'Duo' ) AS type
FROM interpretation
GROUP BY id_emission, date, id_chanson
) AS types ,
interpretation AS i, emission as e, chanson as c
WHERE types.type = 'Duo'
AND i.id_emission = types.id_emission
AND i.date = types.date
AND i.id_chanson = types.id_chanson
AND i.id_emission = e.id
AND i.id_chanson = c.id
AND i.id_chanson = '$id_chanson'
ORDER BY i.id_emission, i.date, i.id_emission
";
// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
// on fait une boucle qui va faire un tour pour chaque enregistrement
while($data = mysql_fetch_assoc($req))
{
// on traite les informations de l'enregistrement en cours
// une chanson => N emission, dont chacune => 2 artistes
//Pour la même emission/date stocker les noms des artistes séparés par &
//On va remplir un tableau de duos dont l'index unique est (emmision et date)
//le DUO est enregistré pour la Même emission et même date
$id_emission = $data[id_emission];
$date = $data[date];
$les_duos [$id_emission][$date][duo] .= $data[nom_artiste]." & " ; //Cumul des noms des duos dans la même case
//enregistrer aussi les autres infos utiles ex. le nom de l'emission
$les_duos [$id_emission][$date][nom_emission] = $data[nom];
}
//Si le tableau des duos est rempli l'afficher
echo "<p>Le titre <b>$id_chanson</b> a été interprété en Duo par : ";
if ($les_duos)
//Liste des emissions
foreach ($les_duos as $emissions){
//sous-liste des dates d'emission
foreach ($emissions as $date => $data){
//infos emission à une date
$duo = preg_replace("#&$#","", trim($data[duo])); //Elimine le dernier & dans le nom du duo
echo "<p><b>$duo</b> - Emission diffusée le ($date)";
}
}
//Liste vide
else echo "<p>Personne!";
?>
Exécuté par l'url: http: //localhost/artistes&chansons/duo.php?id_chanson=1
<HTML><HEAD><TITLE>Recherchez un titre de chanson interprété à Taratata</TITLE>
</HEAD>
<BODY>
<? if(!empty($_POST["titre_chanson"])) { ?>
Voici les artistes qui ont chanté en Duo ou à plusieurs une chanson dont le titre comprend le(s) mot(s) <b><? echo
$_POST["titre_chanson"]; ?></b> :
<br><br>
<? } ?>
<?php
// on se connecte à MySQL
$db = mysql_connect('localhost', 'root', '');
// on sélectionne la base
mysql_select_db('ta..',$db);
//Requête qui extrait les DUO d'une chanson donnée par $id_chanson
$id_chanson = $_GET['id_chanson']; //source de l'id_chanson ciblé
if (!$id_chanson) {echo "<p>Aucune chanson n'est sélectionnée!"; exit;}
$sql = "
SELECT i.id_emission, e.nom, i.date, (SELECT nom FROM artiste WHERE i.id_artiste = id) AS nom_artiste
FROM (
SELECT id_emission, date, id_chanson, if( count( id_artiste ) <2, 'Single', 'Duo' ) AS type
FROM interpretation
GROUP BY id_emission, date, id_chanson
) AS types ,
interpretation AS i, emission as e, chanson as c
WHERE types.type = 'Duo'
AND i.id_emission = types.id_emission
AND i.date = types.date
AND i.id_chanson = types.id_chanson
AND i.id_emission = e.id
AND i.id_chanson = c.id
AND i.id_chanson = '$id_chanson'
ORDER BY i.id_emission, i.date, i.id_emission
";
// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
// on fait une boucle qui va faire un tour pour chaque enregistrement
while($data = mysql_fetch_assoc($req))
{
// on traite les informations de l'enregistrement en cours
// une chanson => N emission, dont chacune => 2 artistes
//Pour la même emission/date stocker les noms des artistes séparés par &
//On va remplir un tableau de duos dont l'index unique est (emmision et date)
//le DUO est enregistré pour la Même emission et même date
$id_emission = $data['id_emission'];
$date = $data['date'];
$les_duos [$id_emission]['$date']['duo'] .= $data['nom_artiste']." & " ; //Cumul des noms des duos dans la même case
//enregistrer aussi les autres infos utiles ex. le nom de l'emission
$les_duos [$id_emission][$date]['nom_emission'] = $data['nom'];
}
//Si le tableau des duos est rempli l'afficher
echo "<p>Le titre <b>$id_chanson</b> a été interprété en Duo par : ";
if ($les_duos)
//Liste des emissions
foreach ($les_duos as $emissions){
//sous-liste des dates d'emission
foreach ($emissions as $date => $data){
//infos emission à une date
$duo = preg_replace("#&$#","", trim($data['duo'])); //Elimine le dernier & dans le nom du duo
echo "<p><b>$duo</b> - Emission diffusée le ($date)";
}
}
//Liste vide
else echo "<p>Personne!";
// on ferme la connexion à mysql
mysql_close();
?>
</body></html>
Notice: Undefined variable: les_duos in c:\documents and settings\developpement.air\bureau\mou\sql4.php on line 68
Notice: Undefined index: 5 in c:\documents and settings\developpement.air\bureau\mou\sql4.php on line 68
Notice: Undefined index: $date in c:\documents and settings\developpement.air\bureau\mou\sql4.php on line 68
Notice: Undefined index: duo in c:\documents and settings\developpement.air\bureau\mou\sql4.php on line 68
Le titre 1 a été interprété en Duo par :
LAYTON & MouMou & JOHNTONE - Emission diffusée le ($date)
Notice: Undefined index: duo in c:\documents and settings\developpement.air\bureau\mou\sql4.php on line 83
- Emission diffusée le (1928-05-10 00:00:00)