par
sadeq » 09 févr. 2006, 11:51
Tiens voici un exemple :
Artistes & chansons
La base de données SQL:
-- 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.
Pour savoir le type "Single" ou "Duo" de l'interprétation :
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.
Pour sélectionner les "Duo" par leur nom :
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
principal permet de définir le champ nom de l'artiste vu que cette info n'est pas accèssible par le FROM principal.
La sous-requête nommée TYPES dans le FROM principal rappelle la requête qui determine le type "Single" et "Duo".
Les autres tables permettent l'accès aux infos interpretation, emission et chanson.
Le WHERE s'occuppe à la fois de ne sélectionner que les "Duo" et de mettre en relation les tables et la sous-requête TYPES.
Tiens voici un exemple :
[b]Artistes & chansons[/b]
[u]La base de données SQL:[/u]
[php]
-- 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);
[/php]
[b]Liste des interprétations par émission:[/b]
[php]
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
[/php]
Comme on le voit ici le WHERE s'occupe principalement des relations entre les tables.
[b]Pour savoir le type "Single" ou "Duo" de l'interprétation :[/b]
[php]
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
[/php]
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.
[b]Pour sélectionner les "Duo" par leur nom :[/b]
[php]
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
[/php]
La sous-requête "(SELECT nom FROM artiste WHERE i.id_artiste = id) AS nom_artiste" qui se trouve dans le SELECT
principal permet de définir le champ nom de l'artiste vu que cette info n'est pas accèssible par le FROM principal.
La sous-requête nommée TYPES dans le FROM principal rappelle la requête qui determine le type "Single" et "Duo".
Les autres tables permettent l'accès aux infos interpretation, emission et chanson.
Le WHERE s'occuppe à la fois de ne sélectionner que les "Duo" et de mettre en relation les tables et la sous-requête TYPES.