如何从数据库查询中创建多维数组

时间:2012-04-09 15:35:25

标签: php mysql multidimensional-array zend-db-select

table name  =  call

表格结构:

user_id | call_time | call_type| 

让我们填充它以便理解

user_id | call_time                   | call_type| 
  0     2012-04-05 07:40:58 GMT+05:00     Mised 
  0     2012-04-06 08:58:45 GMT+05:00     Out 
  0     2012-04-08 09:40:58 GMT+05:00     Incom 

我想做什么

我需要Mysql或等效的Zend Framework查询

  1. call_type的总和。我需要知道每天有多少人出现或错过或收入。

  2. 每天都有多少个call_time。也就是说我有2012-04-05所以它在数据库中有多少时间。

  3. 我需要像

    这样的多维数组
    i =  start from first  day of the month and go up to last day of current month,
    

    i(2012-04-01)了解

    Array
    (
    [ i (2012-04-01)]=>Array
        (
        [Mised ] = 67(sum of all Missed call in this date)
        [Out ] = 10(sum of all out call in this date)
        [Incom ] = 10(sum of all Incom call in this date)
        [total_call] =87 (Sum Of All)
        )
    
     [ i (2012-04-02) ]=>Array
        [Mised ] = 17(sum of all Missed call in this date)
        [Out ] = 2(sum of all out call in this date)
        [Incom ] = 4(sum of all Incom call in this date)
        [total_call] =23 (Sum Of All)
        )
     .
     .
     .
     .
     .
     .
     .
     .
     .
     [2012-04-30(last day current month)]=>Array
        (
        [Mised ] = 77(sum of all Missed call in this date)
        [Out ] = 72(sum of all out call in this date)
        [Incom ] = 24(sum of all Incom call in this date)
        [total_call] =173 (Sum Of All)
        )
    

    让我说我得到的总记录平均日期是(2012-04-13,2012-04-17,2012-04-23,2012-04-27,2012-04-29) 所以我的数组将从2012-04-01开始,因为在我的结果中找不到,所以我的数组将是

    [2012-04-01]=>Array
        (
        [Mised ] = 0
        [Out ] = 0
        [Incom ] = 0
        [total_call] = 0 
    

    和(2012-04-13) 数组将是

    [2012-04-01]=>Array
        (
        [Mised ] = 10
        [Out ] = 55
        [Incom ] = 9
        [total_call] = 74 
        )
    

    我的尝试=

    public function Get_Calllogs_For_Graph($user_id, $phone_service_id){
    
        $curdate = new DateTime(date('Y-m-d')); 
        $current_month = date("m");
        $start_date =    date("Y-$current_month-01");
        $start_date =  $curdate->format("Y-$current_month-d H:i:s");
        $curdate = new DateTime(date('Y-m-d')); 
        $curr_date =  $curdate->format('Y-m-d H:i:s');
    
        $DB = Zend_Db_Table_Abstract::getDefaultAdapter();
        $select = $DB->select()
                                ->from('call', array('*', 'CAST(call_time AS DATE) AS call_time '))
                                        ->where('phone_service_id = ?', $phone_service_id)
                                        ->where('user_id = ?', $user_id)
                                        ->where(" call_time >= ?",  $start_date)
                                        ->where(" call_time<= ?",  $curr_date);
                                            $select = $DB->fetchAssoc($select);
    
    
        $records = array('Outgoing' => array(), 'Incoming' => array(), 'Missed' => array() );               
        if(count($select)){
            foreach($select as $sel){
    
                    if(!array_key_exists($sel['call_name'], $records[$sel['call_type']])){
                        $records[$sel['call_type']][$sel['call_name']] = $this->Get_Calllogs_By_Callname($user_id, $phone_service_id, $start_date, $curr_date, $sel['call_name'], $sel['call_type']);
                    }
    
            }
        }
        echo '<pre>';
        print_r($records);
        echo '</pre>';
    
        }
    public function Get_Calllogs_By_Callname($user_id, $phone_service_id, $start_date, $curr_date, $call_name, $call_direction){
    
            $DB = Zend_Db_Table_Abstract::getDefaultAdapter();
            $select = $DB->select()
                    ->from('call_log', array('COUNT(*) AS total', 'CAST(call_name AS DATE) AS call_name'))
                            ->where('phone_service_id = ?', $phone_service_id)
                            ->where('user_id = ?', $user_id)
                            ->where('call_type= ?', $call_type)
                            ->having('call_name = ? ', $call_name);
                            //->where("call_type>= ?",  $start_date)
                            //->where("call_type<= ?",  $curr_date);
    
                                $select = $select->query()->fetchAll();
                                if(count($select)){
    
                                    return $select[0]['total'];
    
                                }else{
                                    return 0;
                                }
    
        }
    

1 个答案:

答案 0 :(得分:2)

select call_time, call_type, count(*) as num_by_type from db
group by YEAR(call_time), MONTH(call_time), DAY(call_time), call_type.

所以你每天都有每个call_type的总和(意味着每天最多3个条目)。

那么你每天制作一个数组应该不会太难,总和是三种类型之和(num_by_type)的总和。