2010-10-21 19 views
10

Je fais une pagination dans mon application, renvoyant 20 lignes de la base de données à la fois en utilisant les mots-clés standard OFFSET et LIMIT de PostgreSQL. Par exemple, pour obtenir la page 1 page:Equivalent de la fonction FOUND_ROWS() dans Postgresql

SELECT stuff FROM table WHERE condition ORDER BY stuff OFFSET 0 LIMIT 20 

Il est une exigence de l'application que nous montrons également à l'utilisateur le nombre total d'enregistrements. Alors, évidemment, je peux obtenir le total en émettant une requête distincte:

SELECT COUNT(*) FROM table WHERE condition 

Mais s'il y a un grand nombre de lignes, alors ce n'est pas une solution optimale. Je remarque que MySQL a une fonction très utile appelée FOUND_ROWS() qui fait exactement ce que je cherche:

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function%5Ffound-rows

Y at-il un équivalent dans PostgreSQL?

Répondre

24

PostgreSQL a window functions pendant un certain temps maintenant, qui peut être utilisé pour faire beaucoup de choses, y compris des lignes de comptage avant LIMIT est appliquée.

Sur la base de l'exemple ci-dessus:

SELECT stuff, 
     count(*) OVER() AS total_count 
FROM table 
WHERE condition 
ORDER BY stuff OFFSET 40 LIMIT 20