whereIn 遇到了最大限制,临时表处理方式
当使用whereIn 遇到了限制,比如whereIn target ID 已经超过了10万级别,但是又没办法join其他库表时,可以使用临时表的方式解决,临时表是以一种会话的方式存在,意味着你断开了mysql 这个临时会话会自动销毁。
为了创建临时表不会有重名的方式,可以在用零时表的时候用唯一命名。
临时表一般在统计,或者一些复杂的情况下使用。
use Illuminate\Support\Facades\DB;// 创建一个临时表用于存储满足条件的订单项
DB::statement('CREATE TEMPORARY TABLE temp_order_items ASSELECT oi.*FROM order_items oiINNER JOIN orders o ON oi.order_id = o.idWHERE oi.product_id = ? AND o.status = ?', [123, 'completed']
);// 查询满足条件的订单
$filteredOrders = DB::table('orders')->join('temp_order_items', 'orders.id', '=', 'temp_order_items.order_id')->select('orders.*')->get();// 打印结果
foreach ($filteredOrders as $order) {echo "订单ID: " . $order->id . ", 金额: " . $order->total_amount . "\n";
}// 销毁临时表
DB::statement('DROP TEMPORARY TABLE IF EXISTS temp_order_items');
Eloquent ORM,你可以使用createTemporaryTable和dropTemporaryTable等方法来创建和销毁临时表
use Illuminate\Support\Facades\DB;// 创建临时表
DB::statement('CREATE TEMPORARY TABLE temporary_users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255),email VARCHAR(255)
)');// 向临时表插入数据
DB::table('temporary_users')->insert([['name' => 'User1', 'email' => 'user1@example.com'],['name' => 'User2', 'email' => 'user2@example.com'],
]);// 查询临时表中的数据
$users = DB::table('temporary_users')->get();// 在完成操作后,你可以销毁临时表
DB::statement('DROP TEMPORARY TABLE IF EXISTS temporary_users');