码迷,mamicode.com
首页 > 其他好文 > 详细

表的数据很大筛选问题

时间:2015-01-13 10:26:24      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

当条件很大时,我们就不要用IN了。因为那样我们的sql语句就会很大,解决方法用临时表和 左连接加索引

public function run($daily = ‘‘){
        $daily = is_numeric($daily) ? date(‘Y-m-d‘, $daily) : $daily;
        
        if(empty($daily)){
            $daily = date(‘Y-m-d‘, time() - (60*60*24));
        }
        
        // 创建临时表
        $this->salesDailySales->execute("DROP TABLE IF EXISTS 000_sales_p");
        $sql = "CREATE TABLE 000_sales_p 
                SELECT orders_id,orders_platform,orders_import_date
                FROM  orders
                WHERE  orders_import_date=‘".$daily."‘ 
                AND  orders_status NOT IN (‘900‘,‘100‘)";
        $returnInfo = $this->salesDailySales->execute($sql);
        
        if($returnInfo !== false){
            // 给临时表添加索引
            $this->salesDailySales->execute("ALTER TABLE 000_sales_p ADD INDEX (orders_id)");
            
            // 生成临时表 000_tmp_op
            $this->salesDailySales->execute("DROP TABLE IF EXISTS 000_tmp_op");
            $returnInfo = $this->salesDailySales->execute("CREATE TABLE 
                                000_tmp_op 
                            SELECT 
                                p.orders_platform,p.orders_import_date, 
                                op.orders_product_quantity, op.product_id, 
                                op.orders_item_total_price_usd,
                                IF(op.product_attr_code=99,1,op.product_attr_code) as product_attr_code
                            FROM 
                                000_sales_p p
                            LEFT JOIN 
                                orders_product op 
                            ON 
                                p.orders_id = op.orders_id"
            );
            
            
            if($returnInfo !== false){
                
                // 添加 索引 product_id,product_attr_code
                $this->salesDailySales->execute("ALTER TABLE  000_tmp_op ADD INDEX (product_id)");
                $this->salesDailySales->execute("ALTER TABLE  000_tmp_op ADD INDEX (product_attr_code)");
                $sql = "
                    INSERT INTO
                        sales_daily_sales(product_attr_id,product_id,orders_platform,sales_daily_sales_date,daily_sales_qty,daily_sales_gmv)
                    SELECT
                        pa.product_attr_id, pa.product_id, 
                        op.orders_platform, op.orders_import_date, SUM( op.orders_product_quantity ),
                        SUM(op.orders_item_total_price_usd)
                    FROM
                        000_tmp_op op
                    LEFT JOIN
                        product_attr pa
                    ON
                        pa.product_id = op.product_id
                    AND
                        pa.product_attr_code = op.product_attr_code
                    GROUP BY
                        op.orders_import_date, op.orders_platform, product_attr_id";
                
                // 添加数据之前 要删除同一天的数据
                $map = array();
                $map[‘sales_daily_sales_date‘] = $daily;
                $this->salesDailySales->where($map)->delete();
                
                // 导入数据
                $returnInfo = $this->salesDailySales->execute($sql);
                
                // 删除临时表
                $this->salesDailySales->execute("DROP TABLE IF EXISTS 000_tmp_op");
                $this->salesDailySales->execute("DROP TABLE IF EXISTS 000_sales_p");
                
                if($returnInfo !== false){
                    return true;
                }
            }
            
            
        }

 

表的数据很大筛选问题

标签:

原文地址:http://www.cnblogs.com/shaoshao/p/4220438.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!