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

Requêtes MySQL Discussion :

Requête imbriquée


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 458
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 458
    Par défaut
    Quoi qu'il en soit, il manque toujours quelquechose, tu n'as aucune jointure entre la table film et les autres tables ...

    Tatayo.

  5. #5
    Membre habitué
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Par défaut
    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 !

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 458
    Par défaut
    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.

  7. #7
    Membre habitué
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Par défaut
    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 ???


Discussions similaires

  1. Pb requête imbriquée
    Par ddams dans le forum Requêtes
    Réponses: 11
    Dernier message: 20/04/2004, 12h13
  2. [Requête] Faire une requête imbriquée?
    Par sekiryou dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2004, 22h52
  3. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29
  4. Requêtes imbriquées ?
    Par Ph. B. dans le forum XMLRAD
    Réponses: 7
    Dernier message: 06/05/2003, 13h19
  5. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 16h15

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