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 :

Double requête


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Symfony - CMS Wordpress - Zend
    Inscrit en
    Septembre 2011
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Symfony - CMS Wordpress - Zend
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 306
    Points : 101
    Points
    101
    Par défaut Double requête
    Bonjour,

    Je travail sur une requete sql

    commet exmple j'ai une table film et une personne,

    avec une relation ManyToMany qui donne comment film_personne

    ma requete devrait chercher si il ya un film qui n'a pas été vu par au moins une personne

    voici ce que j'ai pour l'instant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select * from 
       film as a where 
           not exists(select * from 
              personne as b where 
                not exists(select * from 
                  film_personne as c 
                    where c.film_personne_personne_fk = b.personne_id and 
                      c.film_personne_film_fk = a.film_id));
    merci.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 142
    Points : 38 926
    Points
    38 926
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Pour vérifier qu'un film n'a été vu par aucun spectateur, il suffit de tester la non existence dans la table film_personne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select * 
    from film as a 
    where not exists
         (select 1 
          from film_personne as c 
          where c.film_personne_film_fk = a.film_id)

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 200
    Points : 12 776
    Points
    12 776
    Par défaut
    Bonjour,
    Si je traduis la requête, ça donne:
    Je cherches les films pour lesquels il n'existe pas de personne qui ne l'ai pas vu.
    C'est l'inverse qu'il faut faire:
    Je cherche les films pour lesquels il existe une personne qui ne l'a pas vu.

    Tatayo.

  4. #4
    Membre régulier
    Homme Profil pro
    Symfony - CMS Wordpress - Zend
    Inscrit en
    Septembre 2011
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Symfony - CMS Wordpress - Zend
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 306
    Points : 101
    Points
    101
    Par défaut Merci a tous...
    Merci pour vos réaction.

    voici ma requête suite a la reformulation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select * from 
       film as a where
          not exists ( select * from personne as b where
               exists ( select * from film_personne as c where
                   c.film_personne_personne_fk  = b.personne_id and c.film_personne_film_fk = a.film_id));
    -> traduction : je cherche un film pour lequel il existe pas une personne qui ne l'ai vu..
    qui est equivalent a la requete de escartefigue

    par contre cette requete n'est pas valide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select * from 
       film as a where
          exists ( select * from personne as b where
             not exists ( select * from film_personne as c where
                   c.film_personne_personne_fk  = b.personne_id and c.film_personne_film_fk = a.film_id));
    --> et celle ci quel serait sa traduction?

    merci a vous.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 142
    Points : 38 926
    Points
    38 926
    Billets dans le blog
    9
    Par défaut
    Pourquoi vous compliquez vous la vie
    Vous n'avez pas besoin de la table des personnes
    Je vous ai donné la solution plus haut (cf. ma réponse de 11h56), essayez, vous verrez que ça donne bien la liste des films qui n'ont jamais été vus par qui que ce soit

  6. #6
    Membre régulier
    Homme Profil pro
    Symfony - CMS Wordpress - Zend
    Inscrit en
    Septembre 2011
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Symfony - CMS Wordpress - Zend
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 306
    Points : 101
    Points
    101
    Par défaut
    Merci

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 200
    Points : 12 776
    Points
    12 776
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Pourquoi vous compliquez vous la vie
    Vous n'avez pas besoin de la table des personnes
    Je vous ai donné la solution plus haut (cf. ma réponse de 11h56), essayez, vous verrez que ça donne bien la liste des films qui n'ont jamais été vus par qui que ce soit
    Ce n'est pas comme ça que j'ai compris la question.
    Je pensais qu'il voulait la liste des films qu'au moins une personne n'a pas vu, et non que personne n'a vu.
    Mais j'ai peut-être compris de travers...

    Tatayo.

  8. #8
    Membre régulier
    Homme Profil pro
    Symfony - CMS Wordpress - Zend
    Inscrit en
    Septembre 2011
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Symfony - CMS Wordpress - Zend
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 306
    Points : 101
    Points
    101
    Par défaut Simple ou pas..
    Ma question étais bien les films que au moins une personne n'a pas vu.

    Si le film n'est pas dans la table intermédiaire : film_personnes
    Alors ça veux dire que le film n'a été vu par aucune personnes

    Les deux requête sont équivalente car j'ai le me résultats.

    À mon avis😒

  9. #9
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 066
    Points : 9 417
    Points
    9 417
    Par défaut
    Même si les 2 requêtes donnent le même résultat, il faut utiliser la version 'escartefigue'.

    Si un jour tu as des volumes de données importants, tu seras bien content d'avoir utilisé une solution simple. 2 fois plus simple, et donc 2 fois plus rapide.
    Idem si dans 2 ou 3 ans, tu es amené à revenir sur cette requête, tu seras bien content de relire une requête simple, claire. Si tu tombes sur une requête alambiquée, tu te diras: "Bon sang, mais qu'est ce que je voulais faire avec cette requête. Visiblement, je ne voulais pas la liste des films non-vus par tout le monde, parce que j'aurais utilisé une requête beaucoup plus simple" Et tu seras paumé.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 142
    Points : 38 926
    Points
    38 926
    Billets dans le blog
    9
    Par défaut
    Votre demande intiale était :

    Citation Envoyé par sinzen Voir le message
    [...] ma requete devrait chercher si il ya un film qui n'a pas été vu par au moins une personne

    Puis vous reformulez
    Citation Envoyé par sinzen Voir le message
    Ma question étais bien les films que au moins une personne n'a pas vu.
    Or ce n'est pas du tout la même chose !

    La requête que je vous ai proposée, répond à la première expression de besoins

    Pour la deuxième, liste des films que au moins une personne n'a pas vu, il faut faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select * 
    from film as FI 
    where exists 
         (select 1 
          from personne as PE
          where not exists
               (select 1
                from film_personne as FP
                where FP.film_personne_personne_fk = PE.personne_id 
                  and FP.film_personne_film_fk     = FI.film_id
               )
         );

  11. #11
    Membre régulier
    Homme Profil pro
    Symfony - CMS Wordpress - Zend
    Inscrit en
    Septembre 2011
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Symfony - CMS Wordpress - Zend
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 306
    Points : 101
    Points
    101
    Par défaut Mis au clair
    Je reconnais que les deux reformulation ne sont pas identique. A la base je désirait lister si au moins un film n'a pas été vu..
    Ensuite mes besoin on évoluer vu que j'avais un film je voulais ensuite les lister tous. Voilà tout.

    Merci en tout cas..

Discussions similaires

  1. Double requête count
    Par Chacks86 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 10/10/2008, 19h48
  2. [SQL] Double requête avec jointure
    Par frakosun dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 17/01/2008, 15h03
  3. Double Requête impossible
    Par Arsene12 dans le forum WinDev
    Réponses: 2
    Dernier message: 04/01/2008, 20h02
  4. Double requête access 2007
    Par sobkillerbots dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/10/2007, 11h55
  5. Lenteur datatable car double requête
    Par davdou dans le forum JSF
    Réponses: 3
    Dernier message: 09/07/2007, 10h20

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