选择数据,使其仅返回每个ID的最新行

时间:2019-06-05 07:30:49

标签: sql laravel eloquent query-builder laravel-query-builder

我目前正在开发我的第一个Laravel项目,并且正在使用具有这样的行的数据库:

id       message    timestamp

1        first      1500000000 
1        second     1510000000
1        third      1520000000
1        fourth     1530000000
2        first      1500000000 
2        second     1510000000 
3        first      1500000000 
4        first      1500000000 
4        second     1510000000  
4        third      1520000000 
4        fourth     1530000000 
5        first      1500000000 
5        second     1510000000 
6        first      1500000000 
7        first      1500000000 

(虚拟数据)。我想做一个基于最高时间戳返回最新消息的SQL查询。因此,例如,如果我们查看第一个id,我希望它返回fourth,因为连接到该消息的时间戳比使用id = 1的任何其他记录都要高。

每个ID仅要查询1个查询的原因是,我必须运行的查询越多,运行页面所需的时间就越长,这使得用户体验非常差。

我尝试了一些在线阅读的内容,但无济于事。我尝试使用DISTINCTGROUP BY和遇到的一些问题构建查询。我也看过Laravel文档,但我无法使其正常工作。

$data = \DB::table('data')
         ->distinct()
         ->get();

尝试过类似的事情,但现在我想到了,它可能只返回id,消息和时间戳的唯一组合。

最后,我想得到这样的东西:

id       message    timestamp

1        fourth     1530000000
2        second     1510000000 
3        first      1500000000 
4        fourth     1530000000 
5        second     1510000000 
6        first      1500000000 
7        first      1500000000 

无论如何,如果有人知道如何解决我的问题,我将非常感激。

P.S。由于某种原因,我执行的每个查询大约需要2秒钟才能返回数据(在Laravel Debugger扩展中看到了此信息)。这可能是由于表(3926714)中的大量记录引起的吗?也许有人知道如何减少花费的时间吗?

3 个答案:

答案 0 :(得分:2)

尝试按ID分组,然后按时间戳排序。然后得到消息

\DB::table('data')->groupBy('id')->orderBy('timestamp')->first()->message

编辑:如果您的表很大并且正在急剧增长,并且只需要该消息,请尝试通过原始SQL执行它,而不是雄辩地提高性能。

答案 1 :(得分:0)

您可以执行以下操作:DB :: table('your-table')-> orderby('id',DESC)-> orderby('message',ASC)-> get();

答案 2 :(得分:0)

自我加入

 $sql = "SELECT t1.* FROM data t1 JOIN ( SELECT id, MAX(timestamp) as max_created FROM data GROUP BY id ) t2 ON t1.`id` = t2.`id` AND t1.`timestamp` = t2.`max_created`";

 $rows= DB::select($sql);
 dd($rows);