Обсуждение: Select and order by question

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

Select and order by question

От
Andy Dunlop
Дата:
Hi - I have the following code:

//show table of current events needing action
$sSql = "SELECT id FROM crm_leads ";
$sLeads = pg_exec($conn,$sSql);
for($e=0;$e<pg_numrows($sLeads);$e++){
        $sSql = "SELECT * FROM crm_events WHERE crm_leads_id = ".pg_result($sLeads,$e,"id")." AND follow_up_action!='' ORDER BY follow_up_date asc limit 1";
        $sRes = pg_exec($conn,$sSql);
        $sHits = pg_numrows($sRes);
        if($sHits!=0){
                for($i=0;$i<$sHits;$i++){
              // generate the display here
        }
}

crm_leads is a parent with many crm_events as it's children.
This code gives me the correct set of rows.
My problem is that I want only the last row from crm_events (as per limit 1) but I want those rows sorted by follow_up_date. I guess I need to have the whole query in one select statement? But how?

Any help appreciated
Thanks
Andy Dunlop

www.infocus.co.za
+27 21 532 0335 office
+27 82 770 8749 mobile
Вложения

Re: Select and order by question

От
"chris smith"
Дата:
On 5/3/06, Andy Dunlop <andy@infocus.co.za> wrote:
>
>            Hi - I have the following code:
>
>  //show table of current events needing action
>  $sSql = "SELECT id FROM crm_leads ";
>  $sLeads = pg_exec($conn,$sSql);
>  for($e=0;$e<pg_numrows($sLeads);$e++){
>          $sSql = "SELECT * FROM crm_events WHERE crm_leads_id = ".pg_result($sLeads,$e,"id")." AND
follow_up_action!=''ORDER BY follow_up_date asc limit 1"; 
>          $sRes = pg_exec($conn,$sSql);
>          $sHits = pg_numrows($sRes);
>          if($sHits!=0){
>                  for($i=0;$i<$sHits;$i++){
>                // generate the display here
>          }
>  }
>
>  crm_leads is a parent with many crm_events as it's children.
>  This code gives me the correct set of rows.
>  My problem is that I want only the last row from crm_events (as per limit 1) but I want those rows sorted by
follow_up_date.I guess I need to have the whole query in one select statement? But how? 

select * from crm_leads l, crm_events e where l.id=e.crm_leads_id and
follow_up_action != '' ORDER BY follow_up_date ASC LIMIT 1;

Make sure crm_events crm_leads_id has an index on id and cram_leads id..

--
Postgresql & php tutorials
http://www.designmagick.com/

Re: Select and order by question

От
"Sherwin M. Harris"
Дата:

Assuming you are using a version of a database that can support sub-queries (MySQL 4.1 and up, Postgresql (all reasonably current versions, any other robust RDBMS) you can do the query like this:

$sSql = "SELECT * FROM crm_events WHERE crm_leads_id IN (SELECT id FROM crm_leads) AND follow_up_action!='' ORDER BY follow_up_date asc limit 1"

Not sure what your follow_up_action !=” is suppose to be doing but if the rest works for you that should give you what you want.

 

 

Sherwin Harris

Web Developer

Brigham Young University

 


From: pgsql-php-owner@postgresql.org [mailto:pgsql-php-owner@postgresql.org] On Behalf Of Andy Dunlop
Sent: Wednesday, May 03, 2006 3:13 AM
To: pgsql-php@postgresql.org
Subject: [PHP] Select and order by question

 

Hi - I have the following code:

//show table of current events needing action
$sSql = "SELECT id FROM crm_leads ";
$sLeads = pg_exec($conn,$sSql);
for($e=0;$e<pg_numrows($sLeads);$e++){
        $sSql = "SELECT * FROM crm_events WHERE crm_leads_id = ".pg_result($sLeads,$e,"id")." AND follow_up_action!='' ORDER BY follow_up_date asc limit 1";
        $sRes = pg_exec($conn,$sSql);
        $sHits = pg_numrows($sRes);
        if($sHits!=0){
                for($i=0;$i<$sHits;$i++){
              // generate the display here
        }
}

crm_leads is a parent with many crm_events as it's children.
This code gives me the correct set of rows.
My problem is that I want only the last row from crm_events (as per limit 1) but I want those rows sorted by follow_up_date. I guess I need to have the whole query in one select statement? But how?

Any help appreciated
Thanks

Andy Dunlop

www.infocus.co.za
+27 21 532 0335 office
+27 82 770 8749 mobile

 

Вложения

Re: Select and order by question

От
Дата:
off topic, but still relevant to php sql.  i'll share
something that has made my life much easier wrt sql
statements - heredocs.

the format looks like this:

$sSql = <<<_ESQL

SELECT * FROM crm_events
WHERE crm_leads_id
IN (SELECT id FROM crm_leads)
AND follow_up_action!=''
ORDER BY follow_up_date asc limit 1

_ESQL

the benefits are that it is much more readable, you
don't have to worry about escaping the usual suspect
characters and you can easily copy and paste this code
into a sql tool to test the results of the sql.  you
can also copy and paste from the sql tool back into
your code.  this helps dramatically when you have
20-30 lines of sql with quotes throughout. ;-)

you can look up heredoc in the php for more
information.

good luck.

--- "Sherwin M. Harris" <Sherwin_Harris@byu.edu>
wrote:

> Assuming you are using a version of a database that
> can support
> sub-queries (MySQL 4.1 and up, Postgresql (all
> reasonably current
> versions, any other robust RDBMS) you can do the
> query like this:
>
> $sSql = "SELECT * FROM crm_events WHERE crm_leads_id
> IN (SELECT id FROM
> crm_leads) AND follow_up_action!='' ORDER BY
> follow_up_date asc limit 1"
>
> Not sure what your follow_up_action !=" is suppose
> to be doing but if
> the rest works for you that should give you what you
> want.
>
>
>
>
>
> Sherwin Harris
>
> Web Developer
>
> Brigham Young University
>
>
>
> ________________________________
>
> From: pgsql-php-owner@postgresql.org
> [mailto:pgsql-php-owner@postgresql.org] On Behalf Of
> Andy Dunlop
> Sent: Wednesday, May 03, 2006 3:13 AM
> To: pgsql-php@postgresql.org
> Subject: [PHP] Select and order by question
>
>
>
> Hi - I have the following code:
>
> //show table of current events needing action
> $sSql = "SELECT id FROM crm_leads ";
> $sLeads = pg_exec($conn,$sSql);
> for($e=0;$e<pg_numrows($sLeads);$e++){
>         $sSql = "SELECT * FROM crm_events WHERE
> crm_leads_id =
> ".pg_result($sLeads,$e,"id")." AND
> follow_up_action!='' ORDER BY
> follow_up_date asc limit 1";
>         $sRes = pg_exec($conn,$sSql);
>         $sHits = pg_numrows($sRes);
>         if($sHits!=0){
>                 for($i=0;$i<$sHits;$i++){
>               // generate the display here
>         }
> }
>
> crm_leads is a parent with many crm_events as it's
> children.
> This code gives me the correct set of rows.
> My problem is that I want only the last row from
> crm_events (as per
> limit 1) but I want those rows sorted by
> follow_up_date. I guess I need
> to have the whole query in one select statement? But
> how?
>
> Any help appreciated
> Thanks
>
> Andy Dunlop
>
> www.infocus.co.za
> +27 21 532 0335 office
> +27 82 770 8749 mobile
>
>
>
>


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around
http://mail.yahoo.com

Re: Select and order by question

От
John DeSoi
Дата:
On May 3, 2006, at 12:12 PM, <operationsengineer1@yahoo.com>
<operationsengineer1@yahoo.com> wrote:

> off topic, but still relevant to php sql.  i'll share
> something that has made my life much easier wrt sql
> statements - heredocs.
>
> the format looks like this:
>
> $sSql = <<<_ESQL
>
> SELECT * FROM crm_events
> WHERE crm_leads_id
> IN (SELECT id FROM crm_leads)
> AND follow_up_action!=''
> ORDER BY follow_up_date asc limit 1
>
> _ESQL

A little shameless promotion: pgEdit will even color the heredoc
string for SQL if you start your heredoc string with <<<sql. Works
for <<<html also.

I'll have a short article out soon that shows how you can pretty much
remove all SQL from your PHP code using a simple PHP class and
PostgreSQL functions.


John DeSoi, Ph.D.
http://pgedit.com/
Power Tools for PostgreSQL


Re: Select and order by question

От
Andy Dunlop
Дата:
If anyone is interested, here is the code we eventually have used:

<?php
$sSql = "select id from crm_leads ";
$sLeads = pg_exec($conn,$sSql);
for($e=0;$e<pg_numrows($sLeads);$e++){
    $sSql = "SELECT * FROM crm_events where crm_leads_id = ".pg_result($sLeads,$e,"id")." and follow_up_action!='' ORDER BY follow_up_date desc limit 1";
     $sRes = pg_exec($conn,$sSql);
     $sHits = pg_numrows($sRes);
      
        if($sHits!=0){
               
                for($i=0;$i<$sHits;$i++){
                       
                        $temp_date = explode("-",pg_result($sRes,$i,"follow_up_date"));
                        $temp_tstamp = gmmktime(0,0,0,$temp_date[1],$temp_date[2],$temp_date[0]);                                                         
                        $array_echo[$temp_tstamp] .= "<tr><td>".$compName1."</td><td>".$empl1."</td><td>".pg_result($sRes,$i,"date")."</td><td>".pg_result($sRes,$i,"description")."</td><td>".pg_result($sRes,$i,"type")."</td><td>".pg_result($sRes,$i,"follow_up_action")."</td><td>".pg_result($sRes,$i,"follow_up_date")."</td><td><a href='crm_events_edit.php?id=".pg_result($sRes,$i,"id")."'>Edit</a></td><td><a href='crm_events_bycomp.php?id=".pg_result($sRes,$i,"crm_leads_id")."'>Action</a></td></tr>";
                }
    }
}
?>
<html>
<head>
<title>
CRM - Events
</title>
</head>
<body bgcolor="<?echo $sBodyColor?>">
<?php require("menu.php"); ?>
<table width='100%'>
<tr><td><h2><font color='<? echo $sHeadingColor?>'>Events Requiring Action</font></h2></td>
<td align='right'><a href='manual/crm_events.html' target='_blank'><img src='images/help_btn.jpg' border=0></a></td>
</table>
<? asort($array_echo); ?>
<? foreach($array_echo as $ae){
        echo $ae;
   }
?>
<? echo $prog_echo_end; ?>
</body>
</html>

The limit 1 gets us the last qualifying event on each lead, and this result is stuck into an array which is sorted by follow_up_date prior to display.

I probably didn't explain the problem too well! But thanks for the input.
Andy


On Wed, 2006-05-03 at 08:56 -0600, Sherwin M. Harris wrote:
Assuming you are using a version of a database that can support sub-queries (MySQL 4.1 and up, Postgresql (all reasonably current versions, any other robust RDBMS) you can do the query like this:

$sSql = "SELECT * FROM crm_events WHERE crm_leads_id IN (SELECT id FROM crm_leads) AND follow_up_action!='' ORDER BY follow_up_date asc limit 1"

Not sure what your follow_up_action !=” is suppose to be doing but if the rest works for you that should give you what you want.

 

 


Sherwin Harris

Web Developer

Brigham Young University

 



From:pgsql-php-owner@postgresql.org [mailto:pgsql-php-owner@postgresql.org] On Behalf Of Andy Dunlop
Sent: Wednesday, May 03, 2006 3:13 AM
To: pgsql-php@postgresql.org
Subject: [PHP] Select and order by question


 

Hi - I have the following code:

//show table of current events needing action
$sSql = "SELECT id FROM crm_leads ";
$sLeads = pg_exec($conn,$sSql);
for($e=0;$e<pg_numrows($sLeads);$e++){
        $sSql = "SELECT * FROM crm_events WHERE crm_leads_id = ".pg_result($sLeads,$e,"id")." AND follow_up_action!='' ORDER BY follow_up_date asc limit 1";
        $sRes = pg_exec($conn,$sSql);
        $sHits = pg_numrows($sRes);
        if($sHits!=0){
                for($i=0;$i<$sHits;$i++){
              // generate the display here
        }
}

crm_leads is a parent with many crm_events as it's children.
This code gives me the correct set of rows.
My problem is that I want only the last row from crm_events (as per limit 1) but I want those rows sorted by follow_up_date. I guess I need to have the whole query in one select statement? But how?

Any help appreciated
Thanks

Andy Dunlop

www.infocus.co.za
+27 21 532 0335 office
+27 82 770 8749 mobile



 


Andy Dunlop

www.infocus.co.za
+27 21 532 0335 office
+27 82 770 8749 mobile
Вложения