Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
bon je vais voir comment corriger la jointure qui me retourne mes doublons, ce sera plus sage
merci pour l'aide quand meme
Hors ligne
Pages : 1