表的数据很大筛选问题

当条件很大时,我们就不要用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;

                }

            }

            

            

        }

 

你可能感兴趣的:(数据)