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

Langage SQL Discussion :

Sélection + jointure avec plusieurs correspondances (trouver les films dans lesquels jouent plusieurs acteurs)


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 19
    Points
    19
    Par défaut Sélection + jointure avec plusieurs correspondances (trouver les films dans lesquels jouent plusieurs acteurs)
    Bonjours à tous,

    Désolé pour l'intitulé un peu long mais je voulais qu'il soit le plus précis possible.
    Mon soucis est plus de l'ordre de l'optimisation ou de la bonne pratique qu'un problème irrésolu.
    Pour simplifié j'ai transposé à l'exemple bateau table FILM, ACTEUR et table d'association FILM_ACTEUR.
    Je cherche, par exemple, les films dans lesquels joue 'Laurence Fishburne' (ACTEUR.id=1) ET 'Keanu Reeves' (ACTEUR.id=2)

    Voici ma 1ère requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT FILM.id FROM FILM JOIN FILM_ACTEUR A ON FILM.id=A.filmID JOIN FILM_ACTEUR B ON FILM.id=B.filmID WHERE A.acteurID=1 AND B.acteurID=2
    Que j'ai vite abandonné car je pouvais avoir des problèmes si je faisais la même recherche mais avec une longue liste d'acteurs.

    Je suis donc passé à cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT FILM.id, COUNT(A.acteurID) AS nbActeur FROM FILM JOIN FILM_ACTEUR A ON FILM.id=A.filmID WHERE A.acteurID IN (1,2,...) GROUP BY A.filmID
    //Et je ne récupère que les tuples où nbActeur est égale à la taille de la liste d'acteur.
    Pour le moment cette requête me convient, elle est plutôt facile à formater, le post traitement ne me pose aucun souci, mais s'il y avait une requête plus élégante, simple et sans post-traitement pour faire ça, ce serai encore mieux. (si j'en demande trop dite le moi)

    J'aimerai donc avoir vos avis expert ou une autre alternative.
    Merci.

    PS: c'est pour une toute petit application en C++ (Qt) donc j'utilise SQLite.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    regardez du côté de la clause HAVING qui va avec GROUP BY

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 269
    Points : 13 533
    Points
    13 533
    Par défaut
    Bonjour,

    pourquoi chercher à faire une jointure interne?

    J'aurais tendance à faire comme un être humain:
    Chercher les films avec acteur1, puis prendre, parmi ces films, ceux avec acteur2.

    Pour cela, SELECT ... FROM (SELECT ... FROM ... WHERE ...) WHERE ...

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    C'est une division relationnelle, dont j'affectionner particulièrement la solution par agrégat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      select film_id
        from FILM_ACTEUR
       where id_acteur in (1, 2)
    group by film_id
      having count(*) = 2;
          -- count(*) si votre PK dans film_acteur est constituée des deux colonnes id_film et id_acteur
          -- sinon count(distinct id_acteur) = 2

  5. #5
    Membre à l'essai
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Je savais bien que l'on pouvait faire une meilleur requête. Mais il faut l'avoué mon SQL est un peu rouillé.
    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Jointure avec tables différentes selon les cas
    Par ninikkhuet dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/07/2014, 20h58
  2. Comment trouver les contrôles dans un DBCtrlGrid
    Par Bruno75 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 19/12/2010, 17h42
  3. Trouver les NULL dans une jointure
    Par atar64 dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/09/2007, 23h30
  4. Trouver les redondances dans un code
    Par progfou dans le forum C
    Réponses: 9
    Dernier message: 17/03/2006, 08h53
  5. Trouver les redirections dans des traces
    Par severine dans le forum Développement
    Réponses: 3
    Dernier message: 21/04/2004, 18h51

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