Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 13/03/2011, 21h14   #1
Candidat au titre de Membre du Club
 
Homme Mathias Léonard
Développeur Web
Inscription : janvier 2009
Messages : 25
Détails du profil
Informations personnelles :
Nom : Homme Mathias Léonard
Localisation : Belgique

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

Informations forums :
Inscription : janvier 2009
Messages : 25
Points : 10
Points : 10
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 :
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.
leom4t est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 22h04   #2
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

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

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
bonjour,

Je pense que tu devrais utiliser la commande where not exists
un truc du genre :
Code :
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
)
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 22h23   #3
Candidat au titre de Membre du Club
 
Homme Mathias Léonard
Développeur Web
Inscription : janvier 2009
Messages : 25
Détails du profil
Informations personnelles :
Nom : Homme Mathias Léonard
Localisation : Belgique

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

Informations forums :
Inscription : janvier 2009
Messages : 25
Points : 10
Points : 10
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é.
leom4t est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 23h22   #4
Candidat au titre de Membre du Club
 
Homme Mathias Léonard
Développeur Web
Inscription : janvier 2009
Messages : 25
Détails du profil
Informations personnelles :
Nom : Homme Mathias Léonard
Localisation : Belgique

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

Informations forums :
Inscription : janvier 2009
Messages : 25
Points : 10
Points : 10
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!
leom4t est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 14h20   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 14h47   #6
Candidat au titre de Membre du Club
 
Homme Mathias Léonard
Développeur Web
Inscription : janvier 2009
Messages : 25
Détails du profil
Informations personnelles :
Nom : Homme Mathias Léonard
Localisation : Belgique

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

Informations forums :
Inscription : janvier 2009
Messages : 25
Points : 10
Points : 10
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.
leom4t est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 17h51   #7
Membre éprouvé
 
Inscription : avril 2008
Messages : 554
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 554
Points : 402
Points : 402
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
zouzoukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h53.


 
 
 
 
Partenaires

Hébergement Web