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 :

Requête avec plusieurs jointures.


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Points : 24
    Points
    24
    Par défaut Requête avec plusieurs jointures.
    Bonsoir tout le monde.

    Je suis confronté à un petit problème de requête SQL. Autant le dire tout de suite, je ne suis pas un expert, ce pourquoi je viens ici.

    Pour mon schéma de DB, le voici, ce sera plus simple avec une image :
    http://img713.imageshack.us/i/32938191.png/
    Un film possède donc un certain nombre d'acteurs (via une table de jointure), et un film peut être vu par des utilisateurs (via la table VIEWS).

    Pour récupérer tous les films d'un certain acteur, et vus par un certain utilisateur, je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sql = "SELECT * FROM MOVIES m INNER JOIN (ACTORS a, ACTORS_MOVIES am,VIEWS v) ON (m.ID_MOVIE = am.MOVIE_ID AND am.ACTOR_ID = a.ID_ACTOR AND m.ID_MOVIE=v.MOVIE_ID) WHERE a.ID_ACTOR = $idActor AND v.USER_ID=$userId";
    Cela me récupère bien les fims d'un certain acteur, et uniquement ceux vus par l'utilisateur en question.
    Cependant, j'aimerais effectuer la même requête, mais pour les films non-vus. Et c'est là que je bloque. À mon avis, je suis aveugle, mais je ne vois pas vraiment comment je peux faire ça...

    Si quelqu'un avait une idée pour moi, ce serait pas mal^^

    Merci d'avance.

  2. #2
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    bonjour,

    Je pense que tu devrais utiliser la commande where not exists
    un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select m1.id_movie from MOVIES m1 where not exists 
    (
    SELECT * FROM MOVIES m INNER JOIN (ACTORS a, ACTORS_MOVIES am,VIEWS v) ON (m.ID_MOVIE = am.MOVIE_ID AND am.ACTOR_ID = a.ID_ACTOR AND m.ID_MOVIE=v.MOVIE_ID) WHERE a.ID_ACTOR = $idActor AND v.USER_ID=$userId and m.id_movie=m1.id_movie
    )

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Points : 24
    Points
    24
    Par défaut
    Le temps d'avoir une réponse, j'avais découvert la piste du NOT EXISTS, mais sans pour autant comprendre comment m'en servir

    Après avoir testé ta méthode, je peux dire que cela fonctionne à merveille.

    Un grand merci donc pour la rapidité.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Points : 24
    Points
    24
    Par défaut
    Désolé, je suis allé un peu trop vite en besogne...

    La requête donnée par carden752 fonctionne bien... mis à part qu'elle me récupére tous les films non vus de l'utilisateur, sans tenir compte de l'id de l'acteur fourni!

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    En écrivant toutes vos jointures avec des INNER JOIN, vous auriez vu tout de suite le filtre en trop dans la sous requete

    D'autre part, la jointure sur la table actors me semble inutile, puisque vous filtrez sur l'ID qui est dans la table movies_actors

    Est-ce que vous voulez les films avec un acteur précis non vus par un user précis ?


    Alors quelque chose comme :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    SELECT m.id_movie 
    FROM MOVIES m
    INNER JOIN ACTORS_MOVIES am
    	ON m.ID_MOVIE = am.MOVIE_ID 
    	AND am1.ID_ACTOR = $idActor --tous les films d'un acteur...
    WHERE NOT EXISTS --...que l'utilisateur n'a jamais vu
    	SELECT * 
    	FROM VIEWS v 
    	WHERE v.MOVIE_ID = m.MOVIE_ID
    	AND v.USER_ID=$userId

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 24
    Points : 24
    Points
    24
    Par défaut
    En effet, cela semble plus propre de cette manière.
    Cela fonctionne parfaitement (après plusieurs vérifications).

    C'est dingue comment cela semble facile pour vous

    Merci en tout cas.

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut
    Citation Envoyé par leom4t Voir le message
    C'est dingue comment cela semble facile pour vous


    Moi je reste perplexe surtout quand ils se mettent à traduire du français en requête! C'est tout simplement ahurissant

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

Discussions similaires

  1. Problème requête sql avec plusieurs jointures
    Par CocoX02 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/02/2015, 13h33
  2. Requête avec plusieurs jointures
    Par Vercetti dans le forum Requêtes
    Réponses: 8
    Dernier message: 13/06/2012, 13h30
  3. Requête avec plusieurs jointures
    Par spull dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/05/2009, 10h57
  4. Requête avec auto jointure récalcitrante
    Par vmolines dans le forum Langage SQL
    Réponses: 15
    Dernier message: 30/03/2006, 21h31
  5. une requête avec plusieurs INNER JOIN, cmt faire ?
    Par elhosni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/01/2006, 17h55

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