Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/02/2011, 16h14   #1
Invité de passage
 
Inscription : octobre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 10
Points : 0
Points : 0
Par défaut Requête imbriquée

Bonjour,

Je travaille actuellement sur un projet de développement de site web et je rencontre un problème pour l'élaboration d'une requête SQL imbriquée.

Voici une partie des tables de ma BDD :

Extrait de la table `films`
Code :
1
2
3
4
5
6
7
(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date_sortie` varchar(100) NOT NULL,
  `annee_production` int(11) NOT NULL,
  `titre` varchar(150) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=218 ;

Extrait de la table `films_genres`
Code :
1
2
3
4
5
(
  `id_film` int(11) NOT NULL,
  `id_genre` varchar(11) NOT NULL,
  PRIMARY KEY  (`id_film`,`id_genre`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
--Extrait du contenu de la table `films_genres`
--

(3, '19'),
(3, '5'),
(10, '6'),
(170, '1'),
(170, '8'),
(188, '1'),
(188, '11'),
Extrait de la table `genres`
Code :
1
2
3
4
5
(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=32 ;
--
-- Extrait du contenu de la table `genres`
--

(1, 'Action'),
(2, 'Animation'),
(3, 'Art Martiaux'),
(4, 'Aventure'),
(5, 'Biopic'),
(6, 'Comédie'),

En fait, je sélectionne l'ensemble des films dont l'un des genre est "Action". A partir de ce résultat, je doit sélectionner les autres genres de chaque film.
Pour cela, je fait la requête suivante :

Code :
1
2
3
4
5
6
SELECT * FROM films_genres fg, films, genres
WHERE                                                                                                 id_film IN ( SELECT id_film FROM films_genres WHERE id_genre=$id_genre )
AND
  fg.id_genre = genres.id
ORDER BY 
  films.id ASC;
La requête fonctionne a moitié car elle me retourne trop de résultats (20 pages) avec plusieurs fois le même film. Moi je doit retourner chaque film une fois, avec l'ensemble des genres leur étant liés.

Voilà, j'espère que quelqu'un pourra me venir en aide.

Merci beaucoup !
k-sper est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 16h23   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Bonjour,
Ta dernière requête n'est pas bonne, car il manque une jointure (3 tables et une seule jointure...). D'ailleurs tu l'aurais remarqué en employant l'opérateur JOIN.

Pour résumer ta demande, tu veux tous films dont l'un des genres est "action", ainsi que leur genre:
Code SQL :
1
2
3
4
5
6
7
 
SELECT film.titre,genre.id,genre.nom
FROM film
INNER JOIN films_genre AS fg1 ON fg1.idfilm = film.id AND fg1.idgenre = 1
INNER JOIN films_genre AS fg2 ON fg2.idfilm = film.id
INNER JOIN genre ON genre.id = fg2.idgenre
ORDER BY film.titre

La jointure sur fg1 permet d'avoir les films d'action, et la jointure fg2 permet de récupérer les genres des films en question.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/02/2011, 17h54   #3
Invité de passage
 
Inscription : octobre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 10
Points : 0
Points : 0
Merci beacuoup pour ta réponse rapide !

Je n'ai pas encore testé ta requête mais je remet la mienne car j'ai vu qu'il y'avait eu un souci pour l'afficher dans me premier post.

La voici :

Code :
1
2
3
4
5
6
7
SELECT * FROM films_genres fg, films, genres
WHERE 
id_film IN ( SELECT id_film FROM films_genres WHERE id_genre=$id_genre )
AND
  fg.id_genre = genres.id
ORDER BY 
  films.id ASC;
Dès que j'ai adapté la tienne à mon code, je te fait signe
k-sper est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 18h29   #4
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Quoi qu'il en soit, il manque toujours quelquechose, tu n'as aucune jointure entre la table film et les autres tables ...

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 18h33   #5
Invité de passage
 
Inscription : octobre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 10
Points : 0
Points : 0
Ok, donc j'ai testé et elle fonctionne comme je le voulais !

J'ai des questions. Comment ca se faite que lors du SELECT, on ne met que FROM films mais qu'on récupère quand même des informations de la table genres ? Pour moi, il faut absolument indiquer dans quelle table se trouve les informations demandées.

Merci beaucoup !
k-sper est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 19h10   #6
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Parce que les autres tables sont dans les jointures qui suivent le FROM !
Tu peux la refaire en mettant toutes les tables dans le FROM et les critères de jointure dans le WHERE, mais cette syntaxe est obsolète depuis... 92...

Et puis en écrivant la requête ainsi, tu vois immédiatement s'il te manque une jointure

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 19h17   #7
Invité de passage
 
Inscription : octobre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 10
Points : 0
Points : 0
Ok merci pour ces infos.

Une dernière question mais je ne sais pas si c'est vraiment réalisable. J'aimerais savoir si il est possible de regrouper les résultats par film ( donc par l'id car 2 films peuvent avoir le même titre ) afin d'avoir chaque ligne "dédiée" à un seul film et comportant tous les genres liés au film ???

k-sper est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 08h38   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 992
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 992
Points : 18 243
Points : 18 243
Envoyer un message via MSN à CinePhil
Comme tu utilises MySQL, il existe un machin pas du tout normatif qui s'appelle GROUP_CONCAT mais en fait ce que tu cherches à faire - avoir tous les genres d'un film sur la même ligne - est de la cosmétique et n'est pas le boulot du SGBD mais celui du logiciel qui présente les données à l'utilisateur.

Et pour apprendre les jointures, c'est par là.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 14h03   #9
Invité de passage
 
Inscription : octobre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 10
Points : 0
Points : 0
Ok je vais y jeter un œil merci.
k-sper est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h55.


 
 
 
 
Partenaires

Hébergement Web