whereIn 遇到了最大限制,临时表处理方式

当使用whereIn 遇到了限制,比如whereIn target ID 已经超过了10万级别,但是又没办法join其他库表时,可以使用临时表的方式解决,临时表是以一种会话的方式存在,意味着你断开了mysql 这个临时会话会自动销毁。

为了创建临时表不会有重名的方式,可以在用零时表的时候用唯一命名。

临时表一般在统计,或者一些复杂的情况下使用。

use Illuminate\Support\Facades\DB;

// 创建一个临时表用于存储满足条件的订单项
DB::statement('CREATE TEMPORARY TABLE temp_order_items AS
    SELECT oi.*
    FROM order_items oi
    INNER JOIN orders o ON oi.order_id = o.id
    WHERE 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' => '[email protected]'],
    ['name' => 'User2', 'email' => '[email protected]'],
]);

// 查询临时表中的数据
$users = DB::table('temporary_users')->get();

// 在完成操作后,你可以销毁临时表
DB::statement('DROP TEMPORARY TABLE IF EXISTS temporary_users');

你可能感兴趣的:(mysql)