我有一张桌子:
ID|user_id|group_id|subject |book_id|duplicate
1| 2 |3 |history |1 |
2| 4 |3 |history |1 |
3| 5 |3 |history |1 |
我希望结果表看起来像这样:
ID|user_id|group_id|subject |book_id|duplicate
1| 2 |3 |history |1 |
2| 4 |3 |history |1 |1
3| 5 |3 |history |1 |1
我希望将最低ID
重复列之后的所有升序ID更新为1.请注意:ID是动态的,因此只使用->where(ID, '>', 1);
不会在所有情况下都有效。
$duplicates = DB::table('table')
->where('subject', 'history')
->where('book_id', 1)
->skip(1)->take(1)
->update(['duplicate' => 1]);
上面的代码不起作用,因为我得到一个如下所示的结果表:
ID|user_id|group_id|subject |book_id|duplicate
1| 2 |3 |history |1 | 1
2| 4 |3 |history |1 |
3| 5 |3 |history |1 |
答案 0 :(得分:1)
使用此
DB::table('table')
->where('subject', 'history')
->where('book_id', 1)
->where('id', '>', 1)
->update(['duplicate' => 1]);
答案 1 :(得分:0)
您正在尝试将偏移应用于UPDATE
查询,这不是有效的SQL(我假设查询构建器在调用skip(1)->take(1)
时默默忽略您的update()
调用。)
实现您正在寻找的结果的一种方法是找到应标记为非重复的所有ID(duplicate = null),然后更新每个其他相关记录。
具体书籍
$original = DB::table('table')
->select('id')
->where('subject', 'history')->where('book_id', 1)
->orderBy('id', 'asc')->first()->pluck('id'); // Lowest id
DB::table('table')
->where('subject', 'history')->where('book_id', 1)
->whereNot('id', $original) // All, but one
->update(['duplicate' => 1]);
所有图书
$originals = DB::table('table')
// One for every combination of `subject` and `book_id`
->groupBy('subject', 'book_id')>orderBy('id', 'asc')
->lists('id');
DB::table('table')
->whereNotIn('id', $originals) // All, but one for every book
->update(['duplicate' => 1]);
您可以进一步优化任一示例以使用子查询而不是两个单独的查询。