如何使用Eloquent选择每个值的最后记录?

时间:2019-04-09 14:54:46

标签: mysql database laravel

如何为user_id的每个option_id选择最新的?

+-----+-----------+---------+-------+
| id  | option_id | user_id | value |
+-----+-----------+---------+-------+
| 241 |         6 |       2 |     2 |
| 240 |         5 |       2 |     1 |
|  90 |         5 |       2 |    15 |
|  75 |         4 |       2 |    11 |
|  76 |         4 |       2 |     1 |
|  77 |         4 |       2 |     2 |
|  72 |         4 |       1 |    10 |
|  71 |         4 |       1 |    15 |
|  70 |         5 |       1 |     2 |
+-----+-----------+---------+-------+

如何使用Eloquent编写查询以仅获得给定user_id的每个option_id中的最新值?

对于提供的表,user_id 2的输出应为记录id: 241,240,75。

对于user_id 1记录: 72、70

编辑:

再次重申,我想返回给定user_id的最新option_id的集合。

因此,对于user_id 2,将有3条记录:

  • 记录ID 241,其中保存了option_id 6的最新值
  • 记录ID 240,其中包含option_id 5的最新值
  • 记录ID 75,其中保存了option_id 4的最新值

对于user_id 1,只有2条记录:

  • 记录ID 72,其中保存了option_id 4的最新值
  • 记录ID 70,其中保存了option_id 5的最新值

3 个答案:

答案 0 :(得分:0)

假设该表是User,并考虑$id是动态的。也许这是您的意思:

$user = User::where('user_id', $id) 
            ->orderBy('id', 'DESC') 
            ->get();

最后使用此代码$user->unique('option_id')获得实际结果。


希望对您有所帮助:)

答案 1 :(得分:0)

如果您的表名为user_options,这是Eloquent查询,用于选择您要查找的记录。

        $getValues = DB::table('user_options')
        ->join(DB::raw('(SELECT max(user_options.id) FROM user_options INNER JOIN (
                        SELECT option_id, user_id FROM user_options GROUP BY option_id, user_id) sets
                        WHERE user_options.option_id = sets.option_id AND user_options.user_id = sets.user_id
                        GROUP BY user_options.option_id, user_options.user_id
            ) valuerecords'),
        function($join)
        {
           $join->on('user_options.id', '=', 'valuerecords.id');
        })->select(
            'id',
            'option_id',
            'user_id',
            'value'
        )->get();

原始选择查询获取最新记录的ID,然后将其联接回表以获取记录。

请注意,“最新”记录是ID最高的记录,因此它将获取记录77,而不是75。如果您以不同的方式定义“最新”,则可以相应地更改原始查询。

答案 2 :(得分:0)

结果很简单:

      $options= DB::table('options')
            ->where('user_id', Auth::getUser()->id)
            ->groupBy("option_id")
            ->orderBy("option_id", "DESC")
            ->get();

但是必须为该查询将严格模式设置为false,并在检索到数据后将其恢复为true。

查询之前:


        // turn off strict mode for the below query
        config()->set('database.connections.mysql.strict', false);
        \DB::reconnect(); //important as the existing connection if any would be in strict mode

以及查询之后:

        //now changing back the strict ON
        config()->set('database.connections.mysql.strict', true);
        \DB::reconnect();