zoukankan      html  css  js  c++  java
  • 表的数据很大筛选问题

    当条件很大时,我们就不要用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;
                    }
                }
                
                
            }
  • 相关阅读:
    时间戳 时间 相互转换
    CS Academy Remove Update
    一周水题集锦 2017 9.4
    计蒜客 16877 卡牌游戏
    计蒜客 16876 韩梅梅的抽象画
    九度OJ 题目1534:数组中第K小的数字
    CS Academy Switch the Lights
    CF AIM Tech Round 4 C. Sorting by Subsequences
    CF Round 430 C. Ilya And The Tree
    CS Academy Round 44 Check DFS
  • 原文地址:https://www.cnblogs.com/shaoshao/p/4220438.html
Copyright © 2011-2022 走看看