CI查询结果给出意外结果

时间:2018-10-01 06:31:08

标签: php mysql codeigniter mysqli resultset

我正在使用codeigniter框架的活动类来构建查询,我的查询在下面维护,并且输出和预期输出是不同的,我这在浏览器中的查询结果与在phpmyadmin中的查询结果应该是相同的,但是这里不是:

function searchProperty($data=array()){ 

    if(!empty($data['status']) && $data['status']=="Occupied"){  
        $get_prop_ids = $this->getOccupiedProperty($data);    
    }


    extract($data);

    $this->db->select('p.*');
    $this->db->from('properties p');
    $this->db->join('prop_address pa', 'pa.prop_id = p.id','INNER');
    $this->db->join('prop_details pd', 'pd.prop_id = p.id','INNER');
    $this->db->join('property_type ptype', 'ptype.id = p.property_type_id');

    $get_post_codes = array();


    $this->db->where('p.status', 'Available');



    $prop_ids = '0';
    $post_codes_search = array();
    $search_tearms = array();
    if(empty(!$countkey)){

        $postcode_1_condition = "";
        $location_condition = "";
        $display_addr_condition = ""; 

        for($i=0; $i < $countkey; $i++){

            $var_data = trim($data['search_'.$i]);  
            $search_tearms[] = $var_data;

            $is_complete_address = $this->IsDisplayAddress($var_data);
            if(!$is_complete_address){
                $is_postCode = $this->isPostcode($var_data); 
                if($is_postCode){ 
                    $prop_ids_postcode  = $this->getPropFromProVeiw('postcode',$var_data); 
                    $post_codes_search[] = $var_data;
                    if(count($prop_ids_postcode)){
                        $prop_ids .=  ','.implode(',',$prop_ids_postcode);
                    }                    

                }else{  
                    $is_location = $this->isLocation($var_data);   
                    if($is_location){
                        $prop_ids_location  = $this->getPropFromProVeiw('location',$var_data); 
                        $prop_ids .=  ','.implode(',',$prop_ids_location);
                        //var_dump($prop_ids);      
                    }else{

                        $prop_ids_area  = $this->getPropFromProVeiw('area',$var_data);    
                        if(count($prop_ids_area)){
                            $prop_ids .=  ','.implode(',',$prop_ids_area);
                        }else{
                            $prop_ids_street  = $this->getPropFromProVeiw('street',$var_data);
                            $prop_ids .=  ','.implode(',',$prop_ids_street);
                        }
                    }
                } 

           }else{

               $prop_ids .= $is_complete_address;
           }
        } 
        $prop_ids = trim($prop_ids,',');
        $prop_ids = str_replace(",,,",",",$prop_ids);
        $prop_ids = str_replace(",,",",",$prop_ids);
        $prop_ids = explode(",",$prop_ids); //p($prop_ids);
        $prop_ids = array_unique($prop_ids);
        $additional_ids = implode(",",$prop_ids);
        $this->db->where("p.id in ($additional_ids) "); 
    }



    if(!empty($min)){
        $this->db->where('pd.price_pw >=', $min);
    }
    if(!empty($max)){
        $this->db->where('pd.price_pw <=', $max);
    }
    /*
    $bed  = (isset($bed)) ? $bed : ''; 
    if($bed != '' && $bed != 4){
        $this->db->where('pd.bedrooms', $bed);
    } elseif ($bed != '' && $bed == 4) {
        $this->db->where('pd.bedrooms >=', $bed);
    }*/

    if(!empty($bed) || $bed=='0'){ 
        $bed  = (isset($bed)) ? $bed : [];  
        if(!is_array($bed)){
            $bed = explode(',',$bed);
        }

        if(in_array(4,$bed)){
            $bed[] = 5;
            $bed[] = 6;
            $bed[] = 7;
            $bed[] = 8;
            $bed[] = 9;
            $bed[] = 10;
        }

        if(count($bed)){
            $beds = implode(',',$bed); 
            $this->db->where("pd.bedrooms in ($beds)");
        }
    }


    if(!empty($type) &&  $type == 'apartment'){
        $this->db->where('ptype.prop_category', 'Apartment');
    } elseif(!empty($type) && $type == 'house') {
        $this->db->where('ptype.prop_category', 'House');
    }
    $tag = (!empty($tag)) ? $tag : "";
    if($tag == 'furnished'){
        $this->db->where('pd.furnished_type_id in (0,1)');
    } elseif($tag == 'part-furnished') {
        $this->db->where('pd.furnished_type_id in (1)');
    } elseif($tag == 'unfurnished') {
        $this->db->where('pd.furnished_type_id', 2);
    } elseif($tag == 'furnished-unFurnished') {
        $this->db->where('pd.furnished_type_id in (0,1,2,4)');
    }

    $this->db->where('pa.display_address !=', '');         
    //$this->db->where('pa.latitude !=', '');
    //$this->db->where('pa.longitude !=', ''); 
    $this->db->where('pa.postcode_1 !=', ''); 



    if(!empty($get_prop_ids)){
        $this->db->where("pd.price > 0 or p.id in ($get_prop_ids) "); 
    }else{
        $this->db->where('pd.price >', 0); 
    }

    if(!empty($sort) && $sort == 'highest'){
        $this->db->order_by('pd.price_pw', 'desc');
    } else {
        $this->db->order_by('pd.price_pw', 'asc');
    }

    $this->db->group_by('p.agent_ref,p.id');  
    $tempdb = clone $this->db;

    if(!empty($loadMorePage)) {
        if($loadMorePage == 1){
            $this->db->limit(10, 0);
        } else {
            $page_limit = 10*($loadMorePage-1);
            $this->db->limit(10, $page_limit);
        }
    }

    $query = $this->db->get();



    $sql = $this->db->last_query();
    $queryCount = $tempdb->get();
    if( $query->num_rows() > 0 ){
        $count = $queryCount->num_rows();
        $result = $query->result();
        $propertyData = $result;
    } else {
        $count = 0;
        $propertyData = array();
    }
    //p($search_tearms);
    $get_post_codes = $this->getAllpostCodes($propertyData,$post_codes_search,$search_tearms);

    return array('count' => $count, 'propertyData' => $propertyData, 'query'=>$sql, 'postcodes'=>$get_post_codes);
}

控制器功能为:

    public function search_post(){
    $postData = $this->post(); //p($postData);

    $this->load->model('properties_model', 'properties');
    $this->load->model('prop_details_model', 'prop_details');
    $this->load->model('prop_address_model', 'prop_address');
    $this->load->model('prop_features_model', 'prop_features');
    $this->load->model('prop_media_model', 'prop_media');
    $this->load->model('offices_model', 'office');
    $this->load->model('Main_postcodes_model', 'main_postcode');

    $loadMorePage = !empty($postData['loadMorePage']) ? $postData['loadMorePage'] : 1;

    $properties = $this->properties->searchProperty($postData); //p($properties);
    $property = $properties['propertyData'];
    $count = $properties['count'];
    foreach($property as $index => $prop){
        $property[$index]->detail = $this->prop_details->getByPropid( $prop->id, $this->role_id );
        $property[$index]->address = $this->prop_address->getByPropid( $prop->id );
        $property[$index]->features = $this->prop_features->getByPropid( $prop->id );
        $property[$index]->media = $this->prop_media->getMediaByPropid( $prop->id );
        $property[$index]->mediaEpc = $this->prop_media->getMediaEPCByPropid( $prop->id );
        $property[$index]->floorPlan = $this->prop_media->getMediaFPByPropid( $prop->id );
        $property[$index]->branch = $this->office->getByPropcoCode( $prop->branch_id );
    }

    $similerProperties = array();

    if(!empty($properties['postcodes'])){ 

            $postData['min'] = (!empty($postData['min'])) ? $postData['min'] : '';
            $postData['max'] = (!empty($postData['max'])) ? $postData['max'] : '';
            $postData['type'] = (!empty($postData['type'])) ? $postData['type'] : '';
            $postData['bed'] = (isset($postData['bed'])) ? $postData['bed'] : '';
            $postData['type'] = (!empty($postData['type'])) ? $postData['type'] : '';
            $postData['tag'] = (!empty($postData['tag'])) ? $postData['tag'] : '';
            $postData['count_to_show'] = 10 - $count;
            $postData['postcodes'] = $properties['postcodes']; 
            $postData['query'] = $properties['query']; 

            $similerProperties = $this->properties->similerPropSearch($postData );

            $similerProperties = $similerProperties['propertyData'];

            foreach($similerProperties as $index => $prop){
                $similerProperties[$index]->detail = $this->prop_details->getByPropid( $prop->id, $this->role_id );
                $similerProperties[$index]->address = $this->prop_address->getByPropid( $prop->id );
                $similerProperties[$index]->features = $this->prop_features->getByPropid( $prop->id );
                $similerProperties[$index]->media = $this->prop_media->getMediaByPropid( $prop->id );
                $similerProperties[$index]->mediaEpc = $this->prop_media->getMediaEPCByPropid( $prop->id );
                $similerProperties[$index]->floorPlan = $this->prop_media->getMediaFPByPropid( $prop->id );
                $similerProperties[$index]->branch = $this->office->getByPropcoCode( $prop->branch_id );
            }

    }

    if($loadMorePage > 1){
        $properties = $property;
        $myCarouselIndex = 10*($loadMorePage-1);

        $this->_view_data['properties'] = $properties;
        $this->_view_data['myCarouselIndex'] = $myCarouselIndex;
        $this->_view_data['query'] = $postData['query'];
        $this->_view_data['loadMorePage'] = $loadMorePage;

        $propertyHtml = $this->load->view('frontend/property/loadmore-search', $this->_view_data, true);
        echo $propertyHtml;
    } else {
        $response = array('type' => 'success', 'query'=>$properties['query'], 'message' => "", 'data' => $property, 'count' => $count, 'similerProperties' => $similerProperties); 
        $this->output->set_content_type('application/json')->set_output(json_encode($response));
    }
}

输出如下:

Array
(     
    [propertyData] => Array
    (
        [0] => stdClass Object
            (
                [id] => 1375
                [agent_ref] => BR18739_000013590
                [slug] => 
                [branch_id] => BR18739
                [status_id] => 0
                [property_type_id] => 28
                [is_published] => 1
                [date_available] => 2018-09-10 00:00:00
                [channel_id] => 2
                [let_type_id] => 1
                [location_name] => Beaufort Park
                [status] => Available
                [propco_created_at] => 2018-09-10 08:49:43
                [propco_updated_at] => 2018-09-20 07:20:25
                [created_by] => 3
                [created_at] => 2018-10-01 03:06:12
                [updated_by] => 3
                [updated_at] => 2018-10-01 03:06:12
            )

        [1] => stdClass Object
            (
                [id] => 1129
                [agent_ref] => 22864_000013421
                [slug] => 
                [branch_id] => 22864
                [status_id] => 0
                [property_type_id] => 28
                [is_published] => 1
                [date_available] => 2018-07-30 00:00:00
                [channel_id] => 2
                [let_type_id] => 1
                [location_name] => Kew
                [status] => Available
                [propco_created_at] => 2018-07-30 06:53:40
                [propco_updated_at] => 2018-09-04 11:53:59
                [created_by] => 3
                [created_at] => 2018-10-01 03:02:56
                [updated_by] => 3
                [updated_at] => 2018-10-01 03:02:56
            )

        [2] => stdClass Object
            (
                [id] => 1332
                [agent_ref] => 22864_000013570
                [slug] => 
                [branch_id] => 22864
                [status_id] => 0
                [property_type_id] => 28
                [is_published] => 1
                [date_available] => 2018-09-04 00:00:00
                [channel_id] => 2
                [let_type_id] => 1
                [location_name] => Kew
                [status] => Available
                [propco_created_at] => 2018-09-04 13:30:28
                [propco_updated_at] => 2018-09-10 08:15:49
                [created_by] => 3
                [created_at] => 2018-10-01 03:06:06
                [updated_by] => 3
                [updated_at] => 2018-10-01 03:06:06
            )

        [3] => stdClass Object
            (
                [id] => 1414
                [agent_ref] => 22864_000013611
                [slug] => 
                [branch_id] => 22864
                [status_id] => 0
                [property_type_id] => 28
                [is_published] => 1
                [date_available] => 2018-09-14 00:00:00
                [channel_id] => 2
                [let_type_id] => 1
                [location_name] => Kew
                [status] => Available
                [propco_created_at] => 2018-09-14 07:52:15
                [propco_updated_at] => 2018-09-20 08:42:53
                [created_by] => 3
                [created_at] => 2018-10-01 03:06:21
                [updated_by] => 3
                [updated_at] => 2018-10-01 03:06:21
            )

        [4] => stdClass Object
            (
                [id] => 1404
                [agent_ref] => 22864_000013605
                [slug] => 
                [branch_id] => 22864
                [status_id] => 0
                [property_type_id] => 28
                [is_published] => 1
                [date_available] => 2018-09-13 00:00:00
                [channel_id] => 2
                [let_type_id] => 1
                [location_name] => Kew
                [status] => Available
                [propco_created_at] => 2018-09-13 06:19:20
                [propco_updated_at] => 2018-09-13 06:38:50
                [created_by] => 3
                [created_at] => 2018-10-01 03:06:17
                [updated_by] => 3
                [updated_at] => 2018-10-01 03:06:17
            )

        [5] => stdClass Object
            (
                [id] => 1318
                [agent_ref] => BR22545_000003107
                [slug] => 
                [branch_id] => BR22545
                [status_id] => 5
                [property_type_id] => 9
                [is_published] => 1
                [date_available] => 2018-11-28 00:00:00
                [channel_id] => 2
                [let_type_id] => 1
                [location_name] => Canary Wharf
                [status] => Available
                [propco_created_at] => 2013-05-01 14:10:13
                [propco_updated_at] => 2018-09-10 07:14:17
                [created_by] => 3
                [created_at] => 2018-10-01 03:00:38
                [updated_by] => 3
                [updated_at] => 2018-10-01 03:00:38
            )

        [6] => stdClass Object
            (
                [id] => 1212
                [agent_ref] => BR18739_000000626
                [slug] => 
                [branch_id] => BR18739
                [status_id] => 5
                [property_type_id] => 28
                [is_published] => 1
                [date_available] => 2018-09-19 00:00:00
                [channel_id] => 2
                [let_type_id] => 1
                [location_name] => Beaufort Park
                [status] => Available
                [propco_created_at] => 2012-08-16 15:20:01
                [propco_updated_at] => 2018-09-17 10:33:01
                [created_by] => 3
                [created_at] => 2018-10-01 03:00:43
                [updated_by] => 3
                [updated_at] => 2018-10-01 03:00:43
            )

        [7] => stdClass Object
            (
                [id] => 1403
                [agent_ref] => BR18739_000006003
                [slug] => 
                [branch_id] => BR18739
                [status_id] => 5
                [property_type_id] => 9
                [is_published] => 1
                [date_available] => 2018-09-30 00:00:00
                [channel_id] => 2
                [let_type_id] => 1
                [location_name] => Beaufort Park
                [status] => Available
                [propco_created_at] => 2016-01-22 10:47:09
                [propco_updated_at] => 2018-09-20 07:40:16
                [created_by] => 3
                [created_at] => 2018-10-01 03:02:37
                [updated_by] => 3
                [updated_at] => 2018-10-01 03:02:37
            )

        [8] => stdClass Object
            (
                [id] => 7
                [agent_ref] => BR17546_000002226
                [slug] => 
                [branch_id] => BR17546
                [status_id] => 0
                [property_type_id] => 9
                [is_published] => 1
                [date_available] => 2018-08-30 00:00:00
                [channel_id] => 2
                [let_type_id] => 1
                [location_name] => Kensington
                [status] => Available
                [propco_created_at] => 2012-09-26 14:39:09
                [propco_updated_at] => 2018-08-30 17:08:04
                [created_by] => 3
                [created_at] => 2018-10-01 03:00:06
                [updated_by] => 3
                [updated_at] => 2018-10-01 03:00:06
            )

        [9] => stdClass Object
            (
                [id] => 1177
                [agent_ref] => 22582_000002037
                [slug] => 
                [branch_id] => 22582
                [status_id] => 5
                [property_type_id] => 9
                [is_published] => 1
                [date_available] => 2018-08-21 00:00:00
                [channel_id] => 2
                [let_type_id] => 1
                [location_name] => Surrey Quays (Surrey Quays)
                [status] => Available
                [propco_created_at] => 2012-07-06 17:08:07
                [propco_updated_at] => 2018-08-13 13:03:25
                [created_by] => 3
                [created_at] => 2018-10-01 03:05:03
                [updated_by] => 3
                [updated_at] => 2018-10-01 03:05:03
            )

    )

[query] => SELECT `p`.*
FROM `bnr_properties` `p`
JOIN `bnr_prop_address` `pa` ON `pa`.`prop_id` = `p`.`id`
JOIN `bnr_prop_details` `pd` ON `pd`.`prop_id` = `p`.`id`
JOIN `bnr_property_type` `ptype` ON `ptype`.`id` = `p`.`property_type_id`
WHERE `p`.`status` = 'Available'
AND `pa`.`display_address` != ''
AND `pa`.`postcode_1` != ''
AND `pd`.`price` >0
GROUP BY `p`.`agent_ref`, `p`.`id`
ORDER BY `pd`.`price_pw` ASC
LIMIT 10, 10
) 

当我在phpmyadmin中执行此查询时,得到的结果顺序是不同的。 Query Results screenshot

2 个答案:

答案 0 :(得分:0)

您需要通过使用第三个参数来指定要使用的JOIN

  

如果需要特定类型的JOIN,则可以通过第三个参数进行指定   函数的参数。选项包括:左,右,外部,内部,   左外和右外。

$this->db->join('prop_address pa', 'pa.prop_id = p.id','INNER');
  

在MySQL中,编写JOIN不合格表示INNER JOIN。换一种说法   INNER JOIN中的INNER是可选的。

答案 1 :(得分:0)

MySQL在构建聚合时(即GROUP BY)未评估排序顺序。

实际上可以说id(即1375)来自MySQL在id中看到的第一行。在不同情况下,对同一数据集的相同查询可能会在其中返回不同的值。

如果您需要任何特定表的最新ID,请在选择聚合时使用MAX。

$this->db->select('MAX(p.id) id');// specify other required columns
$this->db->from('properties p');
$this->db->join('prop_address pa', 'pa.prop_id = p.id');
$this->db->join('prop_details pd', 'pd.prop_id = p.id');
$this->db->join('property_type ptype', 'ptype.id = p.property_type_id');
$this->db->where('p.status', 'Available');
$this->db->where('pa.display_address !=', ''); 
$this->db->where('pa.postcode_1 !=', '');    
$this->db->where('pd.price >', 0); 
$this->db->order_by('pd.price_pw', 'asc');
$this->db->group_by('p.agent_ref,p.id');      
$this->db->limit(10, 10);    
$query = $this->db->get();
$result = $query->result(); 
$sql = $this->db->last_query();
return array('propertyData' => $result, 'query'=>$sql);