Обсуждение: Re: [GENERAL] Reordering results for a report

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

Re: [GENERAL] Reordering results for a report

От
"scott.marlowe"
Дата:
First, I'm crossposting this to pgsql-php, please remove the pgsql-general
header when next someone responds.

OK, here's how ya do it.  something like this:

First, after you run a select, you can use pg_field_name to iterate over
the list of fields you're getting back.  I.e. if your select was something
like:

select a1/a2 as div, a1+a2 as sum, a1-a2 as diff, a1, a2 from table;

you could use this:

$count = pg_num_fields($res);
if (isset($flds)) unset($flds);
for ($i=0;$i<$count;$i++){
  $flds[]=pg_field_name($res,$i);
}

Now, when you're printing out the headers for each row, just make the link
have something like:

print "<url goes here...>?orderby=".$flds[$i]."moreurlstuffhere???";

Then, if the orderby is set when you build your query, just append it:

if (isset($orderby)){
  $query.= "order by ".$orderby"
}

Add some directional control:

if (isset($dir)){
  if ($dir=="down") $query.=" DESC";
}

There's more you can do, but does that kinda get the idea across?  sorry
if it's not real detailed.

On Fri, 12 Dec 2003, Nathaniel Price wrote:

> I'm new to this list, so I'm not sure if this is the right place to post
> this. If not, please direct me to where it would be better to post it.
>
> Anyway, I'm creating a report generation tool of sorts in PHP for a
> database. As part of this report generation tool, I'd like to allow the
> user to reorder these results arbitrarily. In other words:
>
> id | offer
> ---+------------
> 1  | Offer 1
> 2  | Offer 2
> 3  | Offer 3
>
> could become
>
> id | offer
> ---+------------
> 3  | Offer 3
> 1  | Offer 1
> 2  | Offer 2
>
> However, I don't see any way of reordering the results arbitrarily,
> short of creating a table that maps the id numbers to an arbitrary sort
> order, joining them and doing an ORDER BY on the sort order numbers,
> like so:
>
> id | offer     | sort
> ---+-----------+------
> 3  | Offer 3   | 1
> 1  | Offer 1   | 2
> 2  | Offer 2   | 3
>
> The problems that I have with this solution are
> --The sort order would be unique for anybody who uses the system, in
> other words, one user may sort one way, and another user another way,
> and perhaps simultaneously. I could fix this by using an additional
> session identifier in the sort table, but that leads me to the next
> problem...
> --I'd have to garbage collect this data everytime I'm finished with it,
> and since it's likely to only be used once for the actual report
> generation and then discarded, it seems like a waste of effort.
>
> So is there a way to make a query where I can sort arbitrarily without
> having to create additional data in the database?
>
> Thanks for your attention.
>
>



Re: [GENERAL] Reordering results for a report

От
Greg Spiegelberg
Дата:
That's how we did it in PHP & Postgres.

Now we use the Tigra suite of javascript functions from SoftComplex.com
that lets the user order the data however they want.  Transfers the load
from our servers to the client browser which suits me just fine.

BTW, I have no affliation with SoftComplex and have only recently
started using their javascript but if a) your dataset is relatively
small(1), b) your budget is also small(2) c) you hate having to write
more code than you need too they're worth a look.

Greg

(1) Small dataset being about 20,000 items for their tree javascript
     depending on the tree structure and about 5,000 rows for the
     table javascript

(2) $119 at SoftComplex gets you the tree & table javascripts plus a
     tooltip, drop down menu, calculator and a calendar functions.  All
     work pretty good when compared to the price.


scott.marlowe wrote:
> First, I'm crossposting this to pgsql-php, please remove the pgsql-general
> header when next someone responds.
>
> OK, here's how ya do it.  something like this:
>
> First, after you run a select, you can use pg_field_name to iterate over
> the list of fields you're getting back.  I.e. if your select was something
> like:
>
> select a1/a2 as div, a1+a2 as sum, a1-a2 as diff, a1, a2 from table;
>
> you could use this:
>
> $count = pg_num_fields($res);
> if (isset($flds)) unset($flds);
> for ($i=0;$i<$count;$i++){
>   $flds[]=pg_field_name($res,$i);
> }
>
> Now, when you're printing out the headers for each row, just make the link
> have something like:
>
> print "<url goes here...>?orderby=".$flds[$i]."moreurlstuffhere???";
>
> Then, if the orderby is set when you build your query, just append it:
>
> if (isset($orderby)){
>   $query.= "order by ".$orderby"
> }
>
> Add some directional control:
>
> if (isset($dir)){
>   if ($dir=="down") $query.=" DESC";
> }
>
> There's more you can do, but does that kinda get the idea across?  sorry
> if it's not real detailed.
>
> On Fri, 12 Dec 2003, Nathaniel Price wrote:
>
>
>>I'm new to this list, so I'm not sure if this is the right place to post
>>this. If not, please direct me to where it would be better to post it.
>>
>>Anyway, I'm creating a report generation tool of sorts in PHP for a
>>database. As part of this report generation tool, I'd like to allow the
>>user to reorder these results arbitrarily. In other words:
>>
>>id | offer
>>---+------------
>>1  | Offer 1
>>2  | Offer 2
>>3  | Offer 3
>>
>>could become
>>
>>id | offer
>>---+------------
>>3  | Offer 3
>>1  | Offer 1
>>2  | Offer 2
>>
>>However, I don't see any way of reordering the results arbitrarily,
>>short of creating a table that maps the id numbers to an arbitrary sort
>>order, joining them and doing an ORDER BY on the sort order numbers,
>>like so:
>>
>>id | offer     | sort
>>---+-----------+------
>>3  | Offer 3   | 1
>>1  | Offer 1   | 2
>>2  | Offer 2   | 3
>>
>>The problems that I have with this solution are
>>--The sort order would be unique for anybody who uses the system, in
>>other words, one user may sort one way, and another user another way,
>>and perhaps simultaneously. I could fix this by using an additional
>>session identifier in the sort table, but that leads me to the next
>>problem...
>>--I'd have to garbage collect this data everytime I'm finished with it,
>>and since it's likely to only be used once for the actual report
>>generation and then discarded, it seems like a waste of effort.
>>
>>So is there a way to make a query where I can sort arbitrarily without
>>having to create additional data in the database?
>>
>>Thanks for your attention.
>>
>>
>
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 7: don't forget to increase your free space map settings


--
Greg Spiegelberg
  Sr. Product Development Engineer
  Cranel, Incorporated.
  Phone: 614.318.4314
  Fax:   614.431.8388
  Email: gspiegelberg@Cranel.com
Cranel. Technology. Integrity. Focus.



Re: Reordering results for a report

От
Nathaniel Price
Дата:
Sorry, that's not really what I'm looking for. When I said that the sort
order could be arbitrary, I meant /arbitrary/. As in "no amount of ORDER
BYs will save me from this one" arbitrary; the records could be in any
order the user specifies.

The idea is that in PHP I'd be using an array to keep track of the
custom order that the results should be returned in, using the array
index to store the sorting order and the values to store the table's
primary key, like so (note that this isn't the code I'm using, it's just
an example):

<?php
$sort[0] = 3; //First record to return (3 is the primary key of the record)
$sort[1] = 1; //Second record to return
$sort[2] = 2; //Third record to return
... //and so on.
?>

What I'm hoping is that somehow I can use that array to make a query
that will return the records in the order that is specified without
having to create an extra table in the database just to store the sort
order that I want to use and joining on it. However, as I mentioned in
my reply to Bruno Wolff III, I'll probably just use temporary tables to
do it, unless anyone can show me a more elegant solution...

Thanks anyway for your reply.

On 12/12/2003 12:38 PM, scott.marlowe wrote :

>First, I'm crossposting this to pgsql-php, please remove the pgsql-general
>header when next someone responds.
>
>OK, here's how ya do it.  something like this:
>
>First, after you run a select, you can use pg_field_name to iterate over
>the list of fields you're getting back.  I.e. if your select was something
>like:
>
>select a1/a2 as div, a1+a2 as sum, a1-a2 as diff, a1, a2 from table;
>
>you could use this:
>
>$count = pg_num_fields($res);
>if (isset($flds)) unset($flds);
>for ($i=0;$i<$count;$i++){
>  $flds[]=pg_field_name($res,$i);
>}
>
>Now, when you're printing out the headers for each row, just make the link
>have something like:
>
>print "<url goes here...>?orderby=".$flds[$i]."moreurlstuffhere???";
>
>Then, if the orderby is set when you build your query, just append it:
>
>if (isset($orderby)){
>  $query.= "order by ".$orderby"
>}
>
>Add some directional control:
>
>if (isset($dir)){
>  if ($dir=="down") $query.=" DESC";
>}
>
>There's more you can do, but does that kinda get the idea across?  sorry
>if it's not real detailed.
>
>On Fri, 12 Dec 2003, Nathaniel Price wrote:
>
>
>
>>I'm new to this list, so I'm not sure if this is the right place to post
>>this. If not, please direct me to where it would be better to post it.
>>
>>Anyway, I'm creating a report generation tool of sorts in PHP for a
>>database. As part of this report generation tool, I'd like to allow the
>>user to reorder these results arbitrarily. In other words:
>>
>>id | offer
>>---+------------
>>1  | Offer 1
>>2  | Offer 2
>>3  | Offer 3
>>
>>could become
>>
>>id | offer
>>---+------------
>>3  | Offer 3
>>1  | Offer 1
>>2  | Offer 2
>>
>>However, I don't see any way of reordering the results arbitrarily,
>>short of creating a table that maps the id numbers to an arbitrary sort
>>order, joining them and doing an ORDER BY on the sort order numbers,
>>like so:
>>
>>id | offer     | sort
>>---+-----------+------
>>3  | Offer 3   | 1
>>1  | Offer 1   | 2
>>2  | Offer 2   | 3
>>
>>The problems that I have with this solution are
>>--The sort order would be unique for anybody who uses the system, in
>>other words, one user may sort one way, and another user another way,
>>and perhaps simultaneously. I could fix this by using an additional
>>session identifier in the sort table, but that leads me to the next
>>problem...
>>--I'd have to garbage collect this data everytime I'm finished with it,
>>and since it's likely to only be used once for the actual report
>>generation and then discarded, it seems like a waste of effort.
>>
>>So is there a way to make a query where I can sort arbitrarily without
>>having to create additional data in the database?
>>
>>Thanks for your attention.
>>
>>
>>
>>
>
>
>
>---------------------------(end of broadcast)---------------------------
>TIP 9: the planner will ignore your desire to choose an index scan if your
>      joining column's datatypes do not match
>
>
>
>


--
___________________________
Nathaniel Price
http://www.tesserportal.net
Webmaster



Re: Reordering results for a report

От
"scott.marlowe"
Дата:
Oh, in that case you're gonna need to use a case switch type setup and
order by that.

select a,
  case when a=3 then 0
       when a=1 then 1
       when a=2 then 2
       else 99999
 end as ob
from table
order by ob;

kinda thing.

On Fri, 12 Dec 2003, Nathaniel Price wrote:

> Sorry, that's not really what I'm looking for. When I said that the sort
> order could be arbitrary, I meant /arbitrary/. As in "no amount of ORDER
> BYs will save me from this one" arbitrary; the records could be in any
> order the user specifies.
>
> The idea is that in PHP I'd be using an array to keep track of the
> custom order that the results should be returned in, using the array
> index to store the sorting order and the values to store the table's
> primary key, like so (note that this isn't the code I'm using, it's just
> an example):
>
> <?php
> $sort[0] = 3; //First record to return (3 is the primary key of the record)
> $sort[1] = 1; //Second record to return
> $sort[2] = 2; //Third record to return
> ... //and so on.
> ?>
>
> What I'm hoping is that somehow I can use that array to make a query
> that will return the records in the order that is specified without
> having to create an extra table in the database just to store the sort
> order that I want to use and joining on it. However, as I mentioned in
> my reply to Bruno Wolff III, I'll probably just use temporary tables to
> do it, unless anyone can show me a more elegant solution...
>
> Thanks anyway for your reply.
>
> On 12/12/2003 12:38 PM, scott.marlowe wrote :
>
> >First, I'm crossposting this to pgsql-php, please remove the pgsql-general
> >header when next someone responds.
> >
> >OK, here's how ya do it.  something like this:
> >
> >First, after you run a select, you can use pg_field_name to iterate over
> >the list of fields you're getting back.  I.e. if your select was something
> >like:
> >
> >select a1/a2 as div, a1+a2 as sum, a1-a2 as diff, a1, a2 from table;
> >
> >you could use this:
> >
> >$count = pg_num_fields($res);
> >if (isset($flds)) unset($flds);
> >for ($i=0;$i<$count;$i++){
> >  $flds[]=pg_field_name($res,$i);
> >}
> >
> >Now, when you're printing out the headers for each row, just make the link
> >have something like:
> >
> >print "<url goes here...>?orderby=".$flds[$i]."moreurlstuffhere???";
> >
> >Then, if the orderby is set when you build your query, just append it:
> >
> >if (isset($orderby)){
> >  $query.= "order by ".$orderby"
> >}
> >
> >Add some directional control:
> >
> >if (isset($dir)){
> >  if ($dir=="down") $query.=" DESC";
> >}
> >
> >There's more you can do, but does that kinda get the idea across?  sorry
> >if it's not real detailed.
> >
> >On Fri, 12 Dec 2003, Nathaniel Price wrote:
> >
> >
> >
> >>I'm new to this list, so I'm not sure if this is the right place to post
> >>this. If not, please direct me to where it would be better to post it.
> >>
> >>Anyway, I'm creating a report generation tool of sorts in PHP for a
> >>database. As part of this report generation tool, I'd like to allow the
> >>user to reorder these results arbitrarily. In other words:
> >>
> >>id | offer
> >>---+------------
> >>1  | Offer 1
> >>2  | Offer 2
> >>3  | Offer 3
> >>
> >>could become
> >>
> >>id | offer
> >>---+------------
> >>3  | Offer 3
> >>1  | Offer 1
> >>2  | Offer 2
> >>
> >>However, I don't see any way of reordering the results arbitrarily,
> >>short of creating a table that maps the id numbers to an arbitrary sort
> >>order, joining them and doing an ORDER BY on the sort order numbers,
> >>like so:
> >>
> >>id | offer     | sort
> >>---+-----------+------
> >>3  | Offer 3   | 1
> >>1  | Offer 1   | 2
> >>2  | Offer 2   | 3
> >>
> >>The problems that I have with this solution are
> >>--The sort order would be unique for anybody who uses the system, in
> >>other words, one user may sort one way, and another user another way,
> >>and perhaps simultaneously. I could fix this by using an additional
> >>session identifier in the sort table, but that leads me to the next
> >>problem...
> >>--I'd have to garbage collect this data everytime I'm finished with it,
> >>and since it's likely to only be used once for the actual report
> >>generation and then discarded, it seems like a waste of effort.
> >>
> >>So is there a way to make a query where I can sort arbitrarily without
> >>having to create additional data in the database?
> >>
> >>Thanks for your attention.
> >>
> >>
> >>
> >>
> >
> >
> >
> >---------------------------(end of broadcast)---------------------------
> >TIP 9: the planner will ignore your desire to choose an index scan if your
> >      joining column's datatypes do not match
> >
> >
> >
> >
>
>
>


Re: [GENERAL] Reordering results for a report

От
Bruno Wolff III
Дата:
On Fri, Dec 12, 2003 at 14:40:34 -0800,
  Nathaniel Price <nprice@tesseract.net> wrote:
> Sorry, that's not really what I'm looking for. When I said that the sort
> order could be arbitrary, I meant /arbitrary/. As in "no amount of ORDER
> BYs will save me from this one" arbitrary; the records could be in any
> order the user specifies.
>
> The idea is that in PHP I'd be using an array to keep track of the
> custom order that the results should be returned in, using the array
> index to store the sorting order and the values to store the table's
> primary key, like so (note that this isn't the code I'm using, it's just
> an example):
>
> <?php
> $sort[0] = 3; //First record to return (3 is the primary key of the record)
> $sort[1] = 1; //Second record to return
> $sort[2] = 2; //Third record to return
> ... //and so on.
> ?>

It would be possible to use this array in a query, but this wouldn't
work well for large data sets as you would be sending the whole array
back and forth a lot. Presumably the reason you want to do the sort
in the database is because the dataset is large enough that you don't
want to buffer the data in PHP in the first place.

I think the temp table solution won't be that simple either. You will
need connection pooling and some way to keep requests from the same
web session using the same postgres session.

You may want to use regular tables which are named by session id and
the have some clean up process that removes tables that are no longer
needed.

Re: [GENERAL] Reordering results for a report (follow-up)

От
Nathaniel Price
Дата:
On 12/13/2003 3:47 PM, Bruno Wolff III wrote :

>On Fri, Dec 12, 2003 at 14:40:34 -0800,
>  Nathaniel Price <nprice@tesseract.net> wrote:
>
>
>>Sorry, that's not really what I'm looking for. When I said that the sort
>>order could be arbitrary, I meant /arbitrary/. As in "no amount of ORDER
>>BYs will save me from this one" arbitrary; the records could be in any
>>order the user specifies.
>>
>>The idea is that in PHP I'd be using an array to keep track of the
>>custom order that the results should be returned in, using the array
>>index to store the sorting order and the values to store the table's
>>primary key, like so (note that this isn't the code I'm using, it's just
>>an example):
>>
>><?php
>>$sort[0] = 3; //First record to return (3 is the primary key of the record)
>>$sort[1] = 1; //Second record to return
>>$sort[2] = 2; //Third record to return
>>... //and so on.
>>?>
>>
>>
>
>It would be possible to use this array in a query, but this wouldn't
>work well for large data sets as you would be sending the whole array
>back and forth a lot. Presumably the reason you want to do the sort
>in the database is because the dataset is large enough that you don't
>want to buffer the data in PHP in the first place.
>
>
I'm not sure how large the data sets will be, but yeah, I'm trying to
keep as much processing and memory out of my PHP scripts as possible.
That and PostgreSQL already has a well debugged sorting algorithm, so
I'm trying not to reinvent the wheel. The other thing is that most
likely the query will be a one time thing until the user "freezes" it
into a final sorted order, and storing lots of data in the database just
to handle one query seems like a pain in the rear to me.

>I think the temp table solution won't be that simple either. You will
>need connection pooling and some way to keep requests from the same
>web session using the same postgres session.
>
>
If I created the table and then executed the query in the same script, I
don't see why it wouldn't work. But I agree, it leaves something to be
desired, and I am not familiar enough with how PHP handles persistant
database connections to know what the side-effects would be.

>You may want to use regular tables which are named by session id and
>the have some clean up process that removes tables that are no longer
>needed.
>
>
What I'll probably do is use the CASE syntax mentioned by Scott Marlowe
to order the query until it is in a final form where it will be accessed
frequently using the same ordering, and store /that/ ordering in the
database in a more-or-less permanent form. If generating a query using
CASE becomes too unwieldy, then I'll look at using a regular table with
session ids to handle it.

Anyway, thanks for all of your help everyone. I think I've got enough
ideas to start working on it.

--
___________________________
Nathaniel Price
http://www.tesserportal.net
Webmaster



Re: [GENERAL] Reordering results for a report

От
Tino Wildenhain
Дата:
Hi Scott,

scott.marlowe schrieb:
[...]
>
> print "<url goes here...>?orderby=".$flds[$i]."moreurlstuffhere???";
>
> Then, if the orderby is set when you build your query, just append it:
>
> if (isset($orderby)){
>   $query.= "order by ".$orderby"
> }
>
> Add some directional control:
>
> if (isset($dir)){
>   if ($dir=="down") $query.=" DESC";
> }
>
[...]

This leads to a nice SQL-injection posibility.
At least it has to made sure that no illegal
data can be transported via $orderby

Regards
Tino


sql_num_rows on win32

От
"Sebastiano Cascione"
Дата:
Hi everyone,
I have a problem, the function sql_num_rows doesn't return any value, this
on php for windows 2000.
Does someone tell me why? It is only a problem on win2k, not on linux.

Tahk in advance

best regards



Re: sql_num_rows on win32

От
Marek Lewczuk
Дата:
Sebastiano Cascione wrote:
> Hi everyone,
> I have a problem, the function sql_num_rows doesn't return any value, this
> on php for windows 2000.
> Does someone tell me why? It is only a problem on win2k, not on linux.
>
> Tahk in advance

Send source code and tell us what PHP version you have.

ML



Re: sql_num_rows on win32

От
"Cornelia Boenigk"
Дата:
Hi Sebastiano

> I have a problem, the function sql_num_rows doesn't return any
value, this
> on php for windows 2000.

As far as I know there is no function

sql_num_rows()

in PHP

Regards
Conni


Re: sql_num_rows on win32

От
Christopher Kings-Lynne
Дата:
Isn't sql_num_rows a MySQL function, not a PostgreSQL one?

Chris

Marek Lewczuk wrote:

> Sebastiano Cascione wrote:
>
>> Hi everyone,
>> I have a problem, the function sql_num_rows doesn't return any value,
>> this
>> on php for windows 2000.
>> Does someone tell me why? It is only a problem on win2k, not on linux.
>>
>> Tahk in advance
>
>
> Send source code and tell us what PHP version you have.
>
> ML
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
>      subscribe-nomail command to majordomo@postgresql.org so that your
>      message can get through to the mailing list cleanly

Re: sql_num_rows on win32

От
Marek Lewczuk
Дата:
Christopher Kings-Lynne wrote:
> Isn't sql_num_rows a MySQL function, not a PostgreSQL one?
>

pg_num_rows() and mysql_num_rows()