dpjuppr1361 2012-04-09 15:35
浏览 75
已采纳

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

table name  =  call

Table structure:

user_id | call_time | call_type| 

Let's populate it for understanding

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 

What I want to do

I need Mysql or equivalent Zend Framework query

  1. sum of of call_type.that is I need to know how many there are Out or Missed or Income in each day.

  2. how many call_time exists in each day.that is lets say I have 2012-04-05 so how many time its in database.

I need multi-dimensional array like

i =  start from first  day of the month and go up to last day of current month,

i(2012-04-01) for understanding

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)
    )

lets say i get total record mean dates that is(2012-04-13 , 2012-04-17 , 2012-04-23 ,2012-04-27 , 2012-04-29) so my array will start from 2012-04-01 as this is not found in my result so for that my array will be

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

and for (2012-04-13) array will be

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

what i have tried =

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条回答 默认 最新

  • dougua3706 2012-04-09 15:53
    关注
    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.
    

    so you have the sum for each call_type per day (means max 3 entries per day).

    Then it shouldn't be too hard for you to make an array per day, total sum being the sum of the sums of the three types (num_by_type).

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题