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 :

Aide pour formuler requête.


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Points : 48
    Points
    48
    Par défaut Aide pour formuler requête.
    Bonjour,

    Je souhaiterais un coup de main pour formuler une requête JPQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public List<Film> tousLesFilmsParThemes1(int first, int max, Long theme) {
    		List<Film> results = em.createQuery("SELECT distinct new Film(f.id, f.titre, f.alphabetique, f.cover, f.url) "
    				+ "FROM Film f LEFT JOIN f.themes t WHERE f.categorieFilm = 1 AND f.valide = true AND t.id = :theme ORDER BY f.id DESC")
    				.setParameter("theme", theme)
    				.setFirstResult(first)
    				.setMaxResults(max)
    				.getResultList();
    		return results;
    	}
    J'essaye de récupérer tous les films qui possède un thème précis. Un films peux avoir plusieurs thèmes et donc maintenant, je souhaiterais sélectionner tous les films qui on 2 thèmes précis mais je ne vois pas comment faire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public List<Film> tousLesFilmsParThemes2(int first, int max, Long theme1, Long theme2) {
    		List<Film> results = em.createQuery("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")
    				.setParameter("theme1", theme1)
    				.setParameter("theme2", theme2)
    				.setFirstResult(first)
    				.setMaxResults(max)
    				.getResultList();
    		return results;
    	}

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Reprenons la requête et essayons de la mettre en forme pour qu'elle ressemble à du SQL standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT distinct f.id, f.titre, f.alphabetique, f.cover, f.url
    FROM    Film f
        LEFT JOIN
            categorieFilm c
            -- ON  c.??? = f.???
        LEFT JOIN
            themes t
            -- ON  t.??? = f.???
    WHERE   c.id = 1
        AND f.valide = true
        AND t.id = :theme1
        AND t.id = :theme2
    ORDER BY f.id DESC
    Quelques remarques sur ce code :
    • Il manque les conditions de jointure entre les différentes tables
    • Pourquoi utiliser des jointures externes ici ?
      • Si des conditions de restrictions sont appliquées sur ces tables dans la clause WHERE, la jointure est automatiquement convertie en jointure stricte.
      • Si ces mêmes restrictions étaient placées dans la condition de jointure, toutes les lignes de la table film seraient retournées, ce qui n'est sans doute pas le but de la requête
    • AND t.id = :theme1 AND t.id = :theme2 : une même colonne sur une même ligne ne peut contenir deux valeurs différentes
    • Si le contenu des tables categorieFilm et themes n'a pas d'autre utilité que restreindre les lignes retournées, ces conditions doivent être placeés dans la clause WHERE en utilisant le prédicat EXISTS

    Tour ceci étant posé, voici à quoi pourrait ressembler la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SELECT 	f.id, f.titre, f.alphabetique, f.cover, f.url
    FROM    Film f
    WHERE   f.valide = true
        AND EXISTS
            (   SELECT  NULL
                FROM    categorieFilm c
                WHERE   c.id = 1
                    AND c.???   = f.???
            )
        AND EXISTS
            (   SELECT  NULL
                FROM    themes t
                WHERE	t.id IN (:theme1, :theme2)
                    AND t.???   = f.???
    	)
    ORDER BY f.id DESC
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

Discussions similaires

  1. aide pour formulation de requête
    Par nric7 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 29/07/2009, 20h59
  2. Aide pour formuler une requête sql
    Par viny dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/05/2008, 20h37
  3. besoin d 'aide pour formuler une requête
    Par cdu dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/04/2006, 19h38
  4. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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