Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Autres composants
Autres composants Forum de support sur les autres composants de Zend Framework.
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 14/09/2011, 10h12   #1
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
Par défaut Zend_Paginator Problème de comptage du nombre de page avec "SELECT DISTINCT"

Bonjour à tous,

comme indiqué dans l'intitulé, j'ai un problème avec Zend_Paginator, lorsque je l'utilise avec une requête qui fait un "select distinct".
Code :
1
2
3
4
5
6
7
8
9
10
 
$select = $db->select()
                    ->distinct()
                    ->from(array('maTable'=>'maTable'), '*')
                    ->join('maTable2', 'maTable.id=maTable2.id', 'nomChamp');
 
$paginator = Zend_Paginator::factory ( $select ); 
$paginator->setPageRange ( 5 );
$paginator->setItemCountPerPage ( $itemsPerPage );
$paginator->setCurrentPageNumber ( $page );
Il semble que la requête générée pour le comptage du nombre de page ne prend pas en compte le "DISTINCT".
En effet, lorsque je teste la requête générée pour l'affichage des résultats dans ma base de données, celle ci prend bien en compte le mot clé "DISTINCT", et j'obtiens un nombre de résultats différents de celui affiché dans ma barre de pagination. Si je teste la requête sans le mot clé "DISTINCT", j'obtiens le même nombre de résultats.

Quelqu'un d'entre vous aurait-il déjà rencontré ce problème? Si oui comment y remédier?

Merci d'avance pour vos réponses...
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 10h35   #2
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Je pense que dans ton cas le distinct est fait sur l'ensemble d'un row et je doute que ceux ci soit identique.

Je t'invite à faire :
Code :
1
2
 
Zend_Debug:dump($select->__toString());
Le mettre avant l'appel au paginator, tu verra donc ta requête.
Pour moi cela vient du *, tu devrais essayer de spécifie la clé primaire de ta table pour voir
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 10h49   #3
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
Merci pour ta réponse.

J'avais déja fait:
Code :
1
2
 
Zend_Debug::dump($select->__toString);
avant l'appel au paginator, et dans la requête qui s'affiche j'ai bien le mot clé "DISTINCT".
C'est à partir de cette requête que j'ai effectué mes tests puis que j'ai remarqué que le nombre de pages affiché était calculé sans prendre en compte le "DISTINCT".

D'autre part, j'ai besoin de toutes les colonnes pour l'affichage des résultats, c'est pour cela que j'utilise le * dans ma requête.
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 10h53   #4
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Tu peux nous faire voir le résultat du __toString()?

merci
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h01   #5
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
Ci-dessous la requête renvoyée:
Code :
1
2
3
 
string(84) "SELECT DISTINCT maTable.* FROM maTable
 LEFT JOIN maTable2 ON maTable.id = maTable2.id"
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h11   #6
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
donc cette requête sur ton sgbd retourne le bon résultat ? Tu en es sur ?

Car tu devrais essayer de faire que ton distinct soit sur ta clé primaire, car la je doute que tu es deux row avec exactement les mêmes informations, du coup ton distinct ne doit servir à rien, entre ça sous phpMyAdmin par exemple et confirme moi que cela te retourne tous les résultat
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h27   #7
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
Oui j'en suis sur!

Quand je lance cette requête sur ma base, j'obtiens le bon nombre de résultats qui est différent de celui qui est affiché dans ma pagination.
Quand je reprends cette même requête et que je la lance en omettant le "DISTINCT" j'obtiens le même nombre qui est affiché dans la pagination???

Comme je l'ai dit auparavant, j'ai besoin de sélectionner tous les champs de ma table pour l'affichage des résultats, c'est pour ça que je n'effectue pas le distinct sur la clé primaire de ma table...
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h35   #8
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Le distinct comme tu l'écrit te retourne obligatoirement toutes les ligens de ta table.

Ton distinct tu le mets par rapport à quel élément de ta table ? qu'est ce qui est susceptible d'apparaître plusieurs fois ? (tu ne peu pas avoir deux clé primaire avec la même valeur donc la je ne vois pas à quoi sert ton distinct, un peu plus de détails serait bien je pense.

C'est pas parce que tu as besoin de tous les champs de ta table que tu ne peux pas utiliser distinct sur un champs particulier
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h39   #9
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
Etant donné que je fais des jointures avec d'autres tables, je peux avoir deux mêmes clés primaires dans mes résultats. Le distinct doit donc se faire sur la clé primaire.
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h48   #10
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Je vois ce que tu veux dire, donc il faut bien que tu essaye de faire le distrinct sur le champs correspondant à ta clé primaire.

Il est possible de faire :
Code :
select distinct(id), champs2, champs3 ...
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h57   #11
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
Le nom des tables sont des paramètres et donc le nom des clés primaires varient d'une table à l'autre.
D'autre part, certaines tables possèdent un trop grand nombre de champ....
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 12h02   #12
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Ben essaye au moins pour voir si ça vient de là déjà, sinon ça va être dur d'avancer, fait le premier teste que je t'ai dis en faisant juste un select sur la clé primaire
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 12h13   #13
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
En effet, ça vient de là, en précisant la clé primaire, le nombre de pages qui s'affiche est cohérent avec les résultats. Reste à moi de voir comment récupérer le nom de la (ou des) clé(s) primaire(s) de la table paramétrée....
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h43.


 
 
 
 
Partenaires

Hébergement Web