构造优化的口才查询

时间:2019-04-04 08:33:20

标签: laravel

我有这张桌子:

许可表

id  parent_id   user_id    renewed_at
1   0           1          2019-01-01
2   0           8          2019-01-01
3   1           7          2019-01-02
4   1           2          2019-01-03
5   2           3          2019-01-02
6   0           2          2019-01-02
7   6           9          2019-01-03
8   2           2          2019-01-09
9   0           3          2019-01-10
10  9           2          2019-01-11
11  9           5          2019-01-12

parent_id栏中指示的许可续签。

问题是许可证可以由user_id字段中指示的不同人员续签。如果用户是最新的续签用户,则可以将其视为许可证的所有者。

如何构建优化的口才查询,该查询将获取特定人员拥有的所有许可,例如= ID为2的用户

我所做的是:

  1. 获取所有最新记录

  2. 如果user_id = 2

  3. 则过滤第1步的结果

这里的问题是该表有10万行,这使我的查询非常昂贵。

更新1:

$records_raw = Permits::groupBy('parent_id')
    ->where('parent_id', '>', 0)
    ->get([DB::raw('MAX(id) as id')])
    ->pluck('id');

$my_permits = Permits::where('user_id', Auth::id())
    ->whereIn('id', $records_raw)
    ->get();

2 个答案:

答案 0 :(得分:0)

您可以使用laravel Eloquent

例如,您想要用户2的最后一条记录(user_id = 2)

$user_id = 2;
Permits::where('user_id',$user_id)->orderBy('renewed_at','desc')->first();

它获取为user_id = 2添加的最新记录。....意味着记录8

8   2           2          2019-01-09

这是优化查询,并不昂贵

更新:

    $user_id = 2;
Permits::where('user_id',$user_id)->where('parent_id','!=',0)->orderBy('renewed_at','desc')->get();

这将返回您想要的内容

希望这会有所帮助

答案 1 :(得分:-1)

请勿使用查询缓存,建议使用

分析查询

DebbugBar-> https://github.com/barryvdh/laravel-debugbar

谢谢,希望对您有所帮助