PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 28/03/2012 10:16:34

palex
Membre

Optimisation requete SQL

Bonjour

je dispose d'une requete qui realise cela :

select
        count(produit0_.id) over() as col_0_0_,
        produit0_.id as col_1_0_,
        produit0_.libelleProduit as col_2_0_
from ma_table
group by col_0_0_,col_1_0_,col_2_0_

j'ai voulu enlevé les group by et mettre un distinct

pour avoir cela:

select distinct 
        count(produit0_.id) over() as col_0_0_,
        produit0_.id as col_1_0_,
        produit0_.libelleProduit as col_2_0_
from ma_table

mais col_0_0_ ne tiens pas compte du distinct et me retourne dans le premier cas le bon nombre et dans le second cas le nombre total de ligne non "groupé" donc ma pagination n'est pas bonne du coup.

j'ai essayé de mettre  count(discinct produit0_.id) over() mais la syntaxe n'est pas autorisé.

existe t il un moyen de le faire?

merci

Hors ligne

#2 28/03/2012 10:28:20

Marc Cousin
Membre

Re : Optimisation requete SQL

Cela devrait marcher:
SELECT distinct * FROM (
        SELECT count(produit0_.id) over() as col_0_0_,
        produit0_.id as col_1_0_,
        produit0_.libelleProduit as col_2_0_
from ma_table) as tmp

Mais ça ne ramènera pas davantage le même résultat que la première requête.

Vous cherchez à faire quoi exactement ? Cela sera certainement plus simple, pour vous aider.


Marc.

Hors ligne

#3 28/03/2012 10:53:57

palex
Membre

Re : Optimisation requete SQL

en fait dans l'application que j'utilise on jouait 3 requetes pour afficher un tableau de produit :


-une pour les données
-une pour la pagination(car on utilise un limit offset sur celle qui remonte les données donc je ne peut pas faire de listeproduit.size() pour connaitre le nombre de ligne...)
-une pour recupérer une valorisation

j'ai deja reussi a virer celle conernant la pagination en ajoutant count(produit0_.id) over()

j'aimerais maintenant rajouter une colonne qui effectue la valorisation au meme titre que la colonne sur la pagination

mais avant cela j'ai voulu essaye de virer les group by en ajoutant simplement un distinct


avec les group by j'ai donc 15 lignes d'affiché et 15 comme valeur du count(produit0_.id) over()  donc nickel.

sans les group by j'ai 36 lignes d'affiché (a cause d'une jointure qui me double certaines données)

avec distinct je retrouve mes 15 lignes mais mon count(produit0_.id) over() contient 36 et je voulais qu il contienne 15

-soi j'arrive à trouver la condition sur ma jointure pour ne pas avoir mes lignes doublé du coup avec distinct tout fonctionnera, mais pas si simple au vu de l'application.
-soi je remet les group by et puis tanpis je laisse comme cela vu que ca fonctionne
-soi je trouve la syntaxe avec le distinct
-soi je change count(produit0_.id) over()  et dans ce cas il existe peut etre une autre methode permettant de remonté le nombre de ligne total d'une requete

d'ailleur entre distinct et group by existe t il une difference niveau perf? sinon je ne m'embete pas et je laisse le group by en attendant de resoudre le problème sur la jointure.

ma question est juste à titre informatif vu que je suis tombé sur ce problème et je voulais comprendre pourquoi.

merci

Dernière modification par palex (28/03/2012 10:57:52)

Hors ligne

#4 28/03/2012 11:23:40

palex
Membre

Re : Optimisation requete SQL

finalement la questions sur la difference entre distinct et group by resoud une partie de mon problème car l'un des deux influ sur les fonctions d'agregat, d'ou mon count(*) over qui me retourne 36 au lieu de 15 smile

bon je vais voir comment corriger la jointure qui me retourne mes doublons, ce sera plus sage smile

merci pour l'aide quand meme wink

Hors ligne

Pied de page des forums