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

PHP & Base de données Discussion :

[Doctrine] select distinct


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Points : 730
    Points
    730
    Par défaut [Doctrine] select distinct
    Bonjour,

    J'essaye de faire un tout simple select distinct mais je n'ai pas le résultat escompté.

    Mon cas est semblable à celui-ci :
    http://trac.doctrine-project.org/ticket/575

    mais la réponse est encore plus floue que la documentation.

    En gros j'ai une requete qui ressemble à ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Doctrine::getTable('Enregistrement')->createQuery('e')->select('e.annee')->distinct()->orderBy('e.annee')
    Dans le but de récupérer que les années de la table mais la requete générée ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT e.id AS e__id, e.annee AS e__annee FROM enregistrement e ORDER BY e.annee
    La colonne id je ne l'ai jamais demandée!!! Je n'en veux pas mais il me la mets comme même.

    j'ai trouvé une autre personne qui avait le même problème mais sans réponse....

    http://trac.doctrine-project.org/ticket/2183

    Du coup j'ai essayé avec DoctrineRawSQL mais je dois mal l'utiliser car j'ai aucun résultat de retourné.

    J'ai aussi essayé en ligne de commande :

    >symfony doctrine:dlq "select Distinct e.annee from Enregistrement e order by e.annee"
    Et là aussi il me retourne tous les enregistrements avec un distinct id, soit toute ma table vu que id est l'identifiant. Alors que là non plus j'ai pas demandé la colonne id.

    Si quelqu'un peux m'éclairer sur ce qui ne va pas. Ca serait étonnant qu'on ne puisse pas faire de distinct avec Doctrine. Sinon je serai obligé de refaire mon projet avec Propel...

    Merci pour toute aide.

  2. #2
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Points : 730
    Points
    730
    Par défaut
    Bonjour,

    J'ai trouvé une solution bancale mais qui permet d'avoir le bon résultat.
    (en faite c'est mon stagiaire qui à trouvé ).

    Si je fais ça (j'ai essayé plusieurs variantes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Doctrine::getTable('Enregistrement')->createQuery('e')->select('e.annee')->distinct(true)->getSql();
    La requete qui est générée :

    SELECT DISTINCT e.id AS e__id, e.annee AS e__annee FROM enregistrement e
    Au final pour avoir le bon résultat je fais un group by.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Doctrine::getTable('Enregistrement')->createQuery('e')->select('e.annee')->groupBy('e.annee')->execute();
    Qui lui me retourne ce que je demande. Certes cette solution n'est pas la plus élégante ni même une solution en elle-même mais disons que c'est une rustine en attendant que ces Môsieurs de chez Doctrine proposent une solution à ce problème.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Points : 1 177
    Points
    1 177
    Par défaut
    Doctrine étant un ORM il attend a traiter des objets liés a la base de données.
    C'est pour cela qu'il t'impose l'ID de la table.
    Je crois que le mieux c'est d'utiliser DoctrineRawSQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $q = new Doctrine_RawSql();
     
     $q->select('{e.annee}')
      ->from('Enregistrement p')
      ->addComponent('e', 'Enregistrement')
      ->distinct(true);
     
    $result = $q->execute(array(),Doctrine::HYDRATE_NONE);

  4. #4
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Points : 730
    Points
    730
    Par défaut
    Merci encore pour cette réponse j'avais soumis ce problème sur la mailing de doctrine et la réponse était un peu évasive. La c'esst plus concret par contre j'ai fait quelques modifs sinon j'avais des messages d'erreurs.

    Ci dessous le code qui fonctionne chez moi!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    $q = new Doctrine_RawSql();
     
             $q->select('{e.annee}')
              ->from('Enregistrement e')
              ->addComponent('e', 'Enregistrement')
              ->distinct(true)
              ->orderBy('e.annee');
     
           return $q->execute();
    la requete générée :

    SELECT DISTINCT e.annee AS e__annee FROM Enregistrement e ORDER BY e.annee

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

Discussions similaires

  1. [Doctrine] Select Distinct
    Par houseismylife175 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/07/2010, 18h41
  2. Select distinct
    Par mic79 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/04/2005, 16h30
  3. select distinct substring
    Par nmerydem dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/06/2004, 16h58
  4. Select distinct et order by
    Par arsgunner dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/06/2004, 11h17
  5. equivalent SELECT DISTINCT pour MyBase?
    Par chrisou31 dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/03/2004, 19h33

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