Aide pour requête...

Aide pour requête... - SQL/NoSQL - Programmation

Marsh Posté le 22-10-2016 à 19:44:21    

Bonjour,
 
Je rencontre un problème pour formuler une requête sql.
 
Imaginons que j'ai une table "films", "themes" et la table de jointure "films_themes"
 
Comment puis-je trouver tous les fims qui possède le thème 1 ET le thème 2 ?
 
Ça parait simple mais je n'y arrive pas...
 
Merci d'avance pour votre aide

Reply

Marsh Posté le 22-10-2016 à 19:44:21   

Reply

Marsh Posté le 22-10-2016 à 22:07:11    

select nomfilm from films
natural join films_themes
where films_themes.idtheme = (
    select idtheme from themes
    where denomination like 'bisounours' or denomination like 'hardcore');

 

? ca marche ça ?


Message édité par stupidduck le 22-10-2016 à 22:07:25
Reply

Marsh Posté le 22-10-2016 à 23:57:07    

En fait, c'est en JPQL que je dois la formuler et je dois utiliser les id...
 
Voici ce que j'ai essayé  
 
SELECT distinct new Film(f.id, f.titre, f.alphabetique, f.cover, f.url)  
FROM Film f  
LEFT JOIN f.categorieFilm c LEFT JOIN f.themes t  
WHERE c.id = 1 AND f.valide = true AND t.id = :theme1 AND t.id = :theme2  
ORDER BY f.id DESC

Reply

Marsh Posté le 23-10-2016 à 11:28:09    

du jean-pol query langage ? ( ;) ) connais pas.

 

sinon, autre piste (il était tard hier...) une intersection.

 

(juste avec les id, après libre a toi de faire les join kivontbien pour récup les titres / catégories)

 

select idfilm from films_themes where idtheme = XX
intersect
select idfilm from films_themes where idtheme = YY

 

si intersect est pas géré par ton sgbd, y a moyen de s'en sortie avec des différences. A intersect B équivaut à A - (A - B)...


Message édité par stupidduck le 23-10-2016 à 11:29:58
Reply

Marsh Posté le 24-10-2016 à 10:10:35    

SELECT f1.IDFilm, f1.TitreFilm
FROM films f1 INNER JOIN films_themes ft1 ON (f1.IDFilm = ft1.IDFilm), films f2 INNER JOIN films_themes ft2 ON (f2.IDFilm = ft2.IDFilm)
WHERE f1.IDFilm = f2.IDFilm AND ft1.IDTheme = XX AND ft2.IDTheme = YY AND ft1.IDTheme <> ft2.IDTheme
GROUP BY f1.IDFilm


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 01-11-2016 à 14:36:53    

Rufo, ta requête fonctionne parfaitement une fois traduite :) Je n'en comprends pas encore tout le sens mais bon...
 
Merci à vous.

Reply

Marsh Posté le 01-11-2016 à 15:30:53    

Il y a une relation 1-n entre films et films_themes. Donc, en une seule jointure entre les 2 tables, c'est pas possible de trouver des films qui ont 2 thèmes différents, c'est-à-dire, des thèmes avec des ID différents. Du coup, vu qu'on va travailler qu'avec des ID de thèmes, on n'a pas besoin de la table thèmes.
 
Je fais donc 2 jointures entre la table films et la table films_themes. Pour la première jointure, je vais rechercher les films qui ont le thème ayant pour ID = XX ; avec la 2ème jointure, je recherche les films qui ont le thème ayant ID = YY.
 
Si je m'arrête sur ces 2 conditions, c'est le bazar dans le résultat ; j'ai pleins de doublons et j'ai pas les films qui ont les 2 thèmes ; j'ai des films qui ont l'un ou l'autre et des fois, les 2. Pour conserver juste les films qui ont les 2 thèmes, j'ajoute 2 conditions :  
1) les films obtenus dans le résultat doivent avoir le même ID dans les jointures -> f1.IDFilm = f2.IDFilm -> ça permet d'avoir que les films qui ont les thèmes ID = XX ET ID = YY
2) il faut éliminer les films que les jointures ont ramené avec des thèmes YY dans la première jointure et XX dans la 2ème et inversement (en gros, la 1ère jointure ne doit pas me ramener les mêmes thèmes que ceux de la 2ème jointure) -> ft1.IDTheme <> ft2.IDTheme
 
C'est plus clair ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed