当条件很大时,我们就不要用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; } } }
时间: 2024-10-20 07:54:40