我目前正在开发我的第一个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个查询的原因是,我必须运行的查询越多,运行页面所需的时间就越长,这使得用户体验非常差。
我尝试了一些在线阅读的内容,但无济于事。我尝试使用DISTINCT
,GROUP 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)中的大量记录引起的吗?也许有人知道如何减少花费的时间吗?
答案 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);