Выбор данных таким образом, чтобы они возвращали только последнюю строку для каждого идентификатора - PullRequest
1 голос
/ 05 июня 2019

В настоящее время я работаю над своим первым проектом 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, который возвращает последнее сообщение на основе самой высокой отметки времени. Так, например, если мы посмотрим на первый идентификатор, я хочу, чтобы он возвратил fourth, потому что отметка времени, связанная с этим сообщением, выше, чем любая другая запись с id = 1.

Причина, по которой я хочу иметь только 1 запрос для каждого идентификатора, заключается в том, что чем больше запросов мне нужно выполнить, тем больше времени требуется для запуска страницы, что делает работу с пользователем довольно плохой.

Я пробовал несколько вещей, которые я прочитал в Интернете, но безрезультатно. Я попытался использовать DISTINCT, GROUP BY и некоторые вопросы, построенные на основе вопросов, с которыми я столкнулся. Я также посмотрел документацию по Laravel, но просто не могу заставить ее работать.

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

Пробовал подобные вещи, но теперь, когда я об этом думаю, это, вероятно, просто возвращает уникальные комбинации id, message и timestamp.

В конце я хотел бы получить что-то вроде этого:

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)? А может кто-то знает, как сократить количество времени, которое требуется?

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Попробуйте сгруппировать по идентификатору, затем упорядочить по отметке времени.Затем получите сообщение

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

Редактировать: Если ваша таблица огромна и резко растет, и вам нужно только сообщение, попробуйте выполнить его с помощью необработанного SQL вместо использования eloquent для быстрой производительности.

0 голосов
/ 05 июня 2019

Вы можете сделать что-то вроде этого: DB :: table ('your-table') -> orderby ('id', DESC) -> orderby ('message', ASC) -> get ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...