Re: need help to build a query

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, October 9, 2006 2:44 pm, afan@xxxxxxxx wrote:
> I have table orders with primary key order_id. I have table
> uploaded_files
> with primary key ufid and uploaded files are linked to orders by
> order_id
> column.
>
> I have to list all orders and uploaded files. this works fine:
>
> $query = mysql_query("
>   select order_id, order_date, order_status
>   from orders
>   order by order_id desc
>   limit 100");
> while($result=mysql_fetch_array($query))
> {
>   echo "ID: ". $result['order_date']."|";
>   echo "DATE: ". $result['order_date'] ."|";
>   echo "STATUS: ". $result['order_status'] ."|";
>   echo "UPLOADED FILES: ";
>   $query2 = mysql_query("
>     select uf.file_name
>     from uploaded_files as uf
>     where uf.order_id = $result['order_id']
>   ");
>   while($result2=mysql_fetch_array($query2))
>   {
>     echo $result2['file_name']."|";
>   }
>   echo "<hr>";
> }
>
> but I know there must be much better solution then this one.

This is really an SQL question...

But let's take the PHP performance test, to stay on topic.

Yes, you are sending 100 queries to the DB through mysql_query.

Does that negatively impact performance on YOUR server for YOUR web
app at your current or 5-year projected levels of usage?

If not, don't waste time trying to optimize it.  K.I.S.S. and use the
queries that work just fine.

As a bonus, the answer to what you actually asked is:


select orders.order_id, order_date, order_status
from orders
left outer join uploaded_files on uploaded_files.order_id =
orders.order_id
order by orders.order_id desc
limit 100

Unfortunately, this limit now applies to the number of uploaded files
and/or orders with no files at all, rather than the number of orders.

AFAIK, there is no easy way to get the exact same limit of 100 orders
with however many uploaded files.

So if you NEED 100 orders, and who cares how many uploaded files, the
solution you have is CORRECT, no matter how wrong it looks.

Actually, you could *maybe* get some performance gain by running
through the first result, gathering up the IDs into an array, and then
splicing that into a single query like:

//outside the loop:
$order_ids_sql = implode(', ', $order_ids);
$result2 = mysql_query("select order_id, file_name from uploaded_files
where order_id in ($order_ids_sql) order by order_id");

You can then run through $result2 "in parallel" with $result1 and
compare the $order_id to make sure you print the right thing at the
right time.

Don't be surprised if the LEFT OUTER JOIN above, or the parallel
processing and the extra array to build the query with 100 IDs turns
out to be not any faster/better than your current solution.  SQL
theory often turns out to be not-so-practical, in my experience.

-- 
Some people have a "gift" link here.
Know what I want?
I want you to buy a CD from some starving artist.
http://cdbaby.com/browse/from/lynch
Yeah, I get a buck. So?

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux