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

Doctrine2 PHP Discussion :

Requete DQL avec EXIST et NOT EXISTS


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Par défaut Requete DQL avec EXIST et NOT EXISTS
    Bonjour,

    je viens à vous car j'ai un soucis sur une requête DQL.
    J'ai une liaison Many to Many entre :
    Entité1<-----Entité2
    Et une liaison Many to One entre :
    Entité2----->TypeEntité2

    TypeEntité2 :
    id
    type

    Dans ma requête je dois récupérer les Entité1 où ils n'existe pas Entité2 qui a un type = A et un type = B.

    Alors voila l'idée de ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT e1.id
                FROM BoiteProjetBundle:Entite1 e1
                WHERE NOT EXISTS (
                    SELECT e2.id
                    FROM BoiteProjetBundle:Entite2 e2
                    JOIN e2.TypeEntité2 te2
                    WHERE e2.Entite1 = e1.id AND te2.type = 'A' OR e2.Entite1 = e1.id AND te2.type = 'B'
                )
    Mais j'ai une erreur du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error: Invalid PathExpression. StateFieldPathExpression or S
    ingleValuedAssociationField expected.
    Je me suis inspiré de l'exemple de la doc de doctrine2 mais il semble que pour une liaison many to many ça fonctionne pas et je commence à être a court d'idée et sur le net j'ai trouvé aucun exemple de la sorte.

    Si quelqu'un peut me sortir de cette mélasse, je serai fan !

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,
    As tu essayé comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT e1.id
         FROM BoiteProjetBundle:Entite1 e1
         WHERE e1.id NOT IN (
             SELECT se1.id
                 FROM BoiteProjetBundle:Entite1 se1
                 JOIN se1.Entite2 se2
                 JOIN se2.TypeEntite2 ste2
                 WHERE ste2.type = 'A' 
                       OR ste2.type = 'B'
                )

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Par défaut
    Yes, merci beaucoup !
    Ça a l'air de fonctionner, je connaissais pas le NOT IN.

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Par défaut
    Rah je bloque encore sur une requête
    C'est quasiment la même chose mais encore une fois le résultat me donne pas la bonne chose...

    Donc liaison One To Many :
    Entité1<------Entité2

    Entité2 :
    id
    code
    entite1_id

    Je doit récupérer les Entité1 qui n'ont pas d'Entité2 et les Entité1 qui ont une Entité2.code = 'C' OU 'V'

    Donc j'ai fait plusieurs essai pour ce qui est de trouver les Entité2.code = 'C' OU 'V' pas de soucis ça fonctionne mais en revanche les Entité1 qui n'ont pas d'Entité2 j'y arrive pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT e1.id
                FROM BoiteProjetBundle:Entite1 e1
                JOIN e1.Entité2 e2
                WHERE e1.id NOT IN (
                    SELECT se2.entite1_id
                    FROM BoiteProjetBundle:Entite2 se2
                ) 
                OR (e2.code = 'V' OR e2.code = 'C')
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT e1.id
                FROM BoiteProjetBundle:Entite1 e1
                JOIN e1.Entité2 e2
                WHERE NOT EXISTS (
                    SELECT se2.id
                    FROM BoiteProjetBundle:Entité2 se2
                    WHERE se2.Entite1 = e1.id
                )
                OR (e2.code = 'V' OR e2.code = 'C')
    et pareil mise à part ceux avec e2.code = 'V' ou 'C' il me ramène pas les Entité1 qui n'ont pas d'Entite2.
    Je fais un peu mon assisté mais je n'ai pas l'habitude de ce genre de requête...
    Promis après c'est fini ^^.

    PS : J'ai essayé à l'inverse avec Exists et il me trouve bien toutes les Entite1 qui ont une Entite2 c'est vraiment bizarre qu'avec le NOT EXIST il me trouve rien... (Pourtant j'en ai sans Entite2 dans ma base de test)

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Par défaut
    J'ai trouvé plus simple mais j'ai le même résultat :
    Je commence a me demander si il y a pas un problème sur mes données mais ça me parait bizarre elles me semble correct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT e1.id
                FROM BoiteProjetBundle:Entite1 e1
                JOIN e1.Entite2 e2
                WHERE (e2.code = 'V' OR e2.code = 'C' OR e1.Entite2 IS EMPTY)

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Par défaut
    Bon j'ai trouvé !!
    Avec un LEFT JOIN ça marche mieux avec la dernière requête !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/10/2008, 12h08
  2. EXISTS et NOT EXISTS
    Par Maljuna Kris dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/09/2007, 10h16
  3. Réponses: 10
    Dernier message: 14/12/2006, 12h53
  4. pb requete mysql avec un WHERE NOT IN
    Par megapacman dans le forum Requêtes
    Réponses: 9
    Dernier message: 27/07/2006, 10h05
  5. Utilisation de EXISTS ou NOT EXISTS
    Par lucky31 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/05/2006, 16h43

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