Обсуждение: Re: psql: question

Поиск
Список
Период
Сортировка

Re: psql: question

От
"Josh Berkus"
Дата:
Chuck,

Please cc: one of the Postgres lists when you query me.  If you're
getting Q&A support just from me, I'll have to start charging you!

> Trying to work out details of how to let users page back and forth
> among a multi-page list of results.
> 
> Problem: I need to know the total number of tuples the query would
> return in order to decide if there are more to display.
> 
> 1) Use CURSOR and FETCH
> 
> $res= $con->exec(
>  "BEGIN WORK;
>  DECLARE gene_result CURSOR FOR
>  SELECT blah blah
>  ORDER BY blah;
>  FETCH $offset IN gene_result
>  ");
> 
> $result->ntuple: returns only the number set by $offset, not TOTAL
> for query.
> 
> 2) use LIMIT OFFSET
> 
> same problem,
> $result->ntuple: returns only the number set by LIMIT, OFFSET, not
> TOTAL for query.
> 
> So there has to be a way to glean both the TOTAL and the SUBSET
> returned?
> 
> Searching the postgresql archives obviously can deal with this
> http://archives.postgresql.org/pgsql-sql/
> 'Displaying documents 11-20 of total 243 found.'

Personally, I don't know any way to do this without running the query
twice.  

Least inefficient approach:  If your interface allows seperating the
SELECT clause from the rest of the query, then run first:

SELECT COUNT(*)
FROM rest-of-query ...

Check that value.  If it's 0, then return a "no records found" message
to the user.  Otherwise, run the query broken into LIMIT and OFFSET
blocks.

More inefficient approach:  if the way the query is being generated
does not allow you to break off the SELECT clause, then you need to
subselect a count:

SELECT COUNT(*) FROM ( SELECT blah FROM rest_of_query) query_count;

This will also give you a count, buut be slightly slower than the
above.

If anybody knows a way to get a count *without* running the query
twice, I'd be glad to hear it!

-Josh Berkus






Re: psql: question

От
"Rajesh Kumar Mallah."
Дата:
Hi

I run the query twice only the first time the query is requested.

In a web context i can keep passing the total number of
record as a query parameter for displaying the subsequent
pages

for the first request is 50% efficient but the remaining are 100%

but the above works under the assumption  that you do not add
record while the end user is browsing the pages which is mostly safe.

regds
mallah.

On Wednesday 08 May 2002 08:53 pm, Josh Berkus wrote:
> Chuck,
>
> Please cc: one of the Postgres lists when you query me.  If you're
> getting Q&A support just from me, I'll have to start charging you!
>
> > Trying to work out details of how to let users page back and forth
> > among a multi-page list of results.
> >
> > Problem: I need to know the total number of tuples the query would
> > return in order to decide if there are more to display.
> >
> > 1) Use CURSOR and FETCH
> >
> > $res= $con->exec(
> >  "BEGIN WORK;
> >  DECLARE gene_result CURSOR FOR
> >  SELECT blah blah
> >  ORDER BY blah;
> >  FETCH $offset IN gene_result
> >  ");
> >
> > $result->ntuple: returns only the number set by $offset, not TOTAL
> > for query.
> >
> > 2) use LIMIT OFFSET
> >
> > same problem,
> > $result->ntuple: returns only the number set by LIMIT, OFFSET, not
> > TOTAL for query.
> >
> > So there has to be a way to glean both the TOTAL and the SUBSET
> > returned?
> >
> > Searching the postgresql archives obviously can deal with this
> > http://archives.postgresql.org/pgsql-sql/
> > 'Displaying documents 11-20 of total 243 found.'
>
> Personally, I don't know any way to do this without running the query
> twice.
>
> Least inefficient approach:  If your interface allows seperating the
> SELECT clause from the rest of the query, then run first:
>
> SELECT COUNT(*)
> FROM rest-of-query ...
>
> Check that value.  If it's 0, then return a "no records found" message
> to the user.  Otherwise, run the query broken into LIMIT and OFFSET
> blocks.
>
> More inefficient approach:  if the way the query is being generated
> does not allow you to break off the SELECT clause, then you need to
> subselect a count:
>
> SELECT COUNT(*) FROM (
>   SELECT blah FROM rest_of_query) query_count;
>
> This will also give you a count, buut be slightly slower than the
> above.
>
> If anybody knows a way to get a count *without* running the query
> twice, I'd be glad to hear it!
>
> -Josh Berkus
>
>
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org

--
Rajesh Kumar Mallah,
Project Manager (Development)
Infocom Network Limited, New Delhi
phone: +91(11)6152172 (221) (L) ,9811255597 (M)

Visit http://www.trade-india.com ,
India's Leading B2B eMarketplace.