php - Laravel SQL 按 WHERE IN Group By 更新行

标签 php mysql sql laravel

我这里有一个小问题。 我不想在一个查询上执行此操作,而不是在 for 循环内运行 10 个查询。

我的代码现在看起来像这样:

foreach($games as $game_id){
    DB::table('game_serials')
    ->whereNull('user_id')
    ->where('game_id', $game_id)
    ->update([
        'user_id' => 1
    ]);
}

所以,我不想在一个查询上执行此操作,而不是为 5000 个用户运行相同的查询,这将非常慢地完成......

我尝试过做这样的事情:

DB::table('game_serials')
->whereNull('user_id')
->whereIn('game_id', $games)
->groupBy('game_id')
->limit(10)
->update([
    'user_id'    => 1
]);

$games 数组如下所示:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
)

但它仅按数组中的第一个值更新 10 行。
如何才能使其只更新数组中每个 game_id 的一行?

最佳答案

我理解您想要实现的目标,并把这作为一项挑战。下面的代码经过测试,可以满足您的要求。它会获取列表中每个游戏的第一个未分配给任何用户的免费系列。第二个查询将选定的序列分配给用户。

$serials = DB::table('game_serials')
    ->selectRaw('min(id) as id')
    ->whereNull('user_id')
    ->whereIn('game_id', $games)
    ->groupBy('game_id')
    ->get()
    ->pluck('id');

$result =  DB::table('game_serials')
    ->whereIn('id', $serials)
    ->update(['user_id' => 1]);

关于php - Laravel SQL 按 WHERE IN Group By 更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44045763/

相关文章:

php - PH或存储过程(函数)

PHP MySQLi - 检查用户权限

php - PHP代码既不产生结果也不产生错误

javascript - PHP 将数据插入数据库

php - 分解多个用户ID

mysql - 查询执行时间太长?

PHP 排名和更新所有数据库行

php - 在文本文件中写入和读取 php 对象?

sql - 选择时间小于或等于 '12:00' Oracle 的日期

PHP mysql 插入日期格式