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 d'un seul champ


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Points : 115
    Points
    115
    Par défaut [Doctrine] Select d'un seul champ
    Bonjour, je souhaiterais ne mettre qu'un seul champ dans le select avec Doctrine mais ça ne fonctionne pas...

    Voici mon code php pourtant si clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $rq = Doctrine_Query::create()
                ->select('COUNT('.$ChampCount.') AS nb, '.$ChampStats)
                ->from($TableStats)
                ->groupBy($ChampStats);
     
        $Statistiques = $rq->fetchArray();
    Quand j'affiche la requête DQL, tout va encore très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT COUNT(individu_id) AS nb, connaissance_id
    FROM maitrise_connaissances
    GROUP BY connaissance_id
    Seulement au moment de générer le SQL il fait n'importe quoi et me met le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SQLSTATE[42803]: Grouping error: 7 ERREUR: la colonne « m.individu_id » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat
    LINE 1: SELECT m.individu_id AS m__individu_id, m.connaissance_id AS...
    ^. Failing Query: "SELECT m.individu_id AS m__individu_id, m.connaissance_id AS m__connaissance_id, COUNT(m.individu_id) AS m__0 FROM maitrise_connaissances m GROUP BY m.connaissance_id"
    Il ne me mets pas qu'un seul champ... J'ai essayé de mettre un alias à la table et mettre clairement alis.nomchamp mais rien à faire il me fait la même chose... J'avais rencontré ce bug depuis un moment mais je m'étais dit tant pis. Mais cette fois ma requête est impossible sans ça...

    Je l'utilise avec postgresql mais je doute que le problème vienne de la.

    Quelqu'un aurait une idée ?

    Merci d'avance.
    Cordialement.

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 236
    Points : 348
    Points
    348
    Par défaut
    Personnellement ont m'as toujours dit que un count se fait sur '*'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $rq = Doctrine_Query::create()
                ->select('COUNT(*) AS nb, '.$ChampStats)
                ->from($TableStats)
                ->groupBy($ChampStats);
     
        $Statistiques = $rq->fetchArray();
    Cela change peut-être les perf, et te donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(*) AS nb, connaissance_id
    FROM maitrise_connaissances
    GROUP BY connaissance_id
    Pensez à la balise [CODE].
    Aucune réponse aux questions par MP.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Points : 115
    Points
    115
    Par défaut
    Un count peut se faire sur n'importe quel champ. C'est surtout utile de spécifier le champ quand tu veux faire un distinct.

    Mais le problème ici ne vient pas de là. Il vient d'un problème de Doctrine qui traduit mal le DQL en SQL.

    Merci d'avance.
    Cordialement.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    AFPA
    Inscrit en
    Novembre 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $rq = Doctrine_Query::create()
                ->select('COUNT('.$ChampCount.') AS nb, '.$ChampStats)
                ->from($TableStats)
                ->groupBy($ChampStats, $ChampCount);
     
        $Statistiques = $rq->fetchArray();
    Cela devrait fonctionner

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Points : 115
    Points
    115
    Par défaut
    Slt. Merci pour la réponse.

    En revanche, ça fonctionnera pour certaines tables mais pas avec le résultat souhaité. Je veux faire le group by sur un seul champ.

    Merci d'avance.

  6. #6
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Je ne suis pas certain de la pertinence de créer des requêtes génériques en Doctrine.

    L'idée de l'architecture dans symfony/doctrine serait plutôt de créer les requêtes directement rattachées à l'objet du modèle concernées. Reste que je ne pense pas que le problème vienne de là.

    Il semblerait que doctrine, lors de la génération du sql ne travaille pas proprement et ne prenne pas en compte les champs que tu demandes, mais tous les champs de la table. Ce qui est en contradiction avec le SQL généré et que tu donnes en exemple.

    Diable !

    Je verrais bien un problème Postrgee et non pas doctrine. Enfin, pas vraiment Postgree, mais pas vraiment doctrine non plus... Je m'explique.

    Essayes ta requête SQL directement dans Postrgree, quel est le résultat ? Si le message d'erreur est le même, doctrine est hors de cause (quoique).

    J'ai dans l'idée, non vérifiée, que ton erreur vient de l'ordre des champs dans la close SELECT. J'avais eu des problèmes similaires, il y a plusieurs années (plus d'une décennie, déjà ! ) avec oracle. L'ordre des champs dans la close select devait être identique à celui de la close GROUP BY et les champs de regroupement devaient être écrits à la fin de la clause SELECT, pour toi, le select deviendrait donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ->select("$ChampStats, COUNT($ChampCount) AS nb")
    accessoirement, je préfère ce type de concaténation dans ce cas, le code est plus lisible, mais cela ne change rien au performance et à la pertinence d'une autre syntaxe.

    Je confirme l'intérêt de faire des count sur autre chose qu'étoile, ce qui, en matière de statistique est indispensable. Quant à faire un GROUP BY sur le champ compté, cela me semble moins pertinent au niveau des résultats...
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Points : 115
    Points
    115
    Par défaut
    Bonsoir, merci beaucoup pour votre réponse.

    Je pense que le problème vient de Doctrine (mais je peux me tromper). Au lieu du fetchArray(), j'ai mis un echo getSqlQuery() et la requête générée avec le select que vous m'avez donné est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT m.individu_id AS m__individu_id, m.connaissance_id AS m__connaissance_id, COUNT(m.individu_id) AS m__0
    FROM maitrise_connaissances m
    GROUP BY m.connaissance_id
    Alors que quand j'affiche le code DQL, voici la requête (valide) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT connaissance_id, COUNT(individu_id) AS nb
    FROM maitrise_connaissances
    GROUP BY connaissance_id
    Selon moi c'est donc bien Doctrine qui se mélange lors de la génération du SQL étant donné que maintenant, aucune requêtes n'a été faite au serveur postgres avec ce code.

    Le problème n'est pas qu'avec les requêtes comportant un group by. J'ai fait la requête la plus bête du monde suivante. Le code DQL affiché est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT connaissance_id
    FROM maitrise_connaissances
    ce qui me génère le code SQL suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT m.individu_id AS m__individu_id, m.connaissance_id AS m__connaissance_id
    FROM maitrise_connaissances m
    Une fois de plus on voit réapparaître ce second champ que je n'ai pas demandé. C'est vraiment étrange. Y aurait-il une option de Doctrine que j'aurais mal gérée ? Un problème d'installation ?

    Merci d'avance.
    Cordialement.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/10/2016, 14h25
  2. Selection combinée sur un seul champ
    Par ironfalcon dans le forum QlikView
    Réponses: 6
    Dernier message: 09/07/2009, 12h01
  3. Réponses: 13
    Dernier message: 20/07/2004, 08h54
  4. Concaténation de 2 select en 1 seul
    Par Fleep dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/08/2003, 11h38

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