2013-06-26 125 views
0

我正在创建一个仪表板,以使我更新呼叫代理状态。代理将在日志中有多个记录。我需要从代理日志中提取最新的状态。我发现的唯一方法是查询代理表,以便在今天进行状态更改的情况下提取代理,然后查询代理日志表以提取最新状态。在php中结合两个mysql查询

有没有办法将这两个查询结合起来?这里是我的查询

$sql_get_agents = "SELECT id FROM agent WHERE lastchange LIKE '{$today}%'"; 
      if($dta = mysql_query($sql_get_agents)){ 

       while($agent = mysql_fetch_assoc($dta)){ 
       $curr_agent[] = $agent; 

       } 

       foreach($curr_agent as $agents_online){ 
        $get_status_sql = "SELECT a.firstname,a.lastname,al.agentid,al.agent_statusid,s.id as statusid,s.status,MAX(al.datetime) as datetime FROM agent_log al 
        INNER JOIN agent a ON al.agentid = a.id 
        INNER JOIN agent_status s ON a.agent_statusid = s.id 
        WHERE al.agentid = '{$agents_online['id']}'"; 
        if($dta2 = mysql_query($get_status_sql)){        
         while($agent_status = mysql_fetch_assoc($dta2)){ 
         $curr_status[] = $agent_status;       
         } 
        } 

       }//end for each 

       return $curr_status; 
      }//end if 
+1

使用JOIN。永远不要在循环中运行查询。 – Jessica

+0

...除非你正在处理所谓的“邻接列表”或类似的 – Strawberry

回答

0

你为什么不加入2个查询到一个在第二个查询添加WHERE lastchange LIKE '{$today}%'条件?

0

使用IN子句应该工作:

"SELECT a.firstname,a.lastname,al.agentid,al.agent_statusid,s.id as statusid,s.status,MAX(al.datetime) as datetime FROM agent_log al 
        INNER JOIN agent a ON al.agentid = a.id 
        INNER JOIN agent_status s ON a.agent_statusid = s.id 
        WHERE al.agentid IN (SELECT id FROM agent WHERE lastchange LIKE '{$today}%'); 
0

你接近你所拥有的东西。这将摆脱需要执行两个查询或循环查询。

编辑:添加示例代码以循环遍历结果。

edit2:改变了查询。

$query = "SELECT 
    a.firstname, 
    a.lastname, 
    al.agentid, 
    al.agent_statusid, 
    s.id as statusid, 
    s.status, 
    MAX(al.datetime) as datetime 
FROM agent a 
    LEFT JOIN agent_log al ON al.agentid = a.id 
    LEFT JOIN agent_status s ON a.agent_statusid = s.id 
WHERE a.lastchange LIKE '{$today}%'"; 

$status = array(); 
$results = mysql_query($query); 
while($agent = mysql_fetch_assoc($results)) 
    $status[] = $agent; 

print_r($status); 
+0

递归我试过了。它只返回一个代理。我需要它返回所有44个代理。 –

+0

@AdamMills你确定你正在循环结果吗?以我的答案为例... – kmfk

+0

是的。只返回一行。它返回的行具有最新的日期时间戳。我认为最大是问题。 –