Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > ORM > Doctrine
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/07/2011, 15h23   #1
Membre régulier
 
Inscription : juin 2008
Messages : 214
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 214
Points : 78
Points : 78
Par défaut 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 :
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 :
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 :
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.
barbug est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 10h35   #2
Membre éclairé
 
Homme Jérémy
Étudiant
Inscription : octobre 2009
Messages : 236
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
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 : 322
Points : 322
Personnellement ont m'as toujours dit que un count se fait sur '*'

Code :
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 :
1
2
3
SELECT COUNT(*) AS nb, connaissance_id
FROM maitrise_connaissances
GROUP BY connaissance_id
gwharl est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 04/07/2011, 22h02   #3
Membre régulier
 
Inscription : juin 2008
Messages : 214
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 214
Points : 78
Points : 78
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.
barbug est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 13h43   #4
Invité de passage
 
Homme Frederic
AFPA
Inscription : novembre 2008
Messages : 18
Détails du profil
Informations personnelles :
Nom : Homme Frederic
Localisation : France, Loiret (Centre)

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

Informations forums :
Inscription : novembre 2008
Messages : 18
Points : 4
Points : 4
Salut

Code :
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
fredxd est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 08/07/2011, 22h01   #5
Membre régulier
 
Inscription : juin 2008
Messages : 214
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 214
Points : 78
Points : 78
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.
barbug est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2011, 17h07   #6
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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 :
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 !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2011, 20h51   #7
Membre régulier
 
Inscription : juin 2008
Messages : 214
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 214
Points : 78
Points : 78
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 :
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 :
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 :
1
2
SELECT connaissance_id
FROM maitrise_connaissances
ce qui me génère le code SQL suivant :

Code :
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.
barbug est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h16.


 
 
 
 
Partenaires

Hébergement Web