@O_Nayre

Как сгруппировать только последовательные записи из базы данных?

Есть таблица правок (на основе venturecraft revisionable):
+----+-----------------+---------+---------------------+
| id | revisionable_id | user_id |     created_at      |
+----+-----------------+---------+---------------------+
|  6 |               1 |       1 | 2017-03-15 23:59:40 |
|  5 |               1 |       1 | 2017-03-15 23:56:40 |
|  4 |               3 |       8 | 2017-03-15 23:55:40 |
|  3 |               4 |       3 | 2017-03-15 23:55:40 |
|  2 |               1 |       1 | 2017-03-15 23:15:40 |
|  1 |               1 |       1 | 2017-03-15 22:59:40 |
+----+-----------------+---------+---------------------+


Можно ли без плясок с бубном сгруппировать данные таким образом, что бы сохраняя возможность постраничной разбивки выводить их следующим образом:

  • пользователь 1 сделал 2 изменения в сущности 1
  • пользователь 8 сделал 1 изменения в сущности 3
  • пользователь 3 сделал 1 изменение в сущности 4
  • пользователь 1 сделал 2 изменения в сущности 1


и при этом группировать и подсчитывать надо только последовательно сделанные правки для одной revisionable_id и игнорировать сделанные ранее. То есть записи с id 1,2 и 5,6 не объединяются, так как между ними есть другие записи. То есть groupBy (revisionable_id) как я понимаю не подходит)?..
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
@O_Nayre Автор вопроса
UPD: не 100% удовлетворяющий требованиям, но рабочий подход
//шаманим постраничную навигацию вручную
        $paginate = 10;
       $page = Input::get('page', 1);
       $offSet = ($page * $paginate) - $paginate;
       //забираем все записи и сортируем их
       $records = Revision::select(
          'revisionable_id',
          'revisionable_type',
          'user_id',
          DB::raw("DATE_FORMAT(created_at, '%Y-%m-%d') as created"),
          DB::raw('count(*) as total')
        )
        ->groupBy('revisionable_id','revisionable_type','user_id','created')
        ->orderBy('created','desc')
        ->get();
       //выбираем записи для нужной страницы
       if($page==1){
         $sliced = collect($records)->slice(0,$paginate)->all();
       }else{
         $sliced = collect($records)->slice($offSet, $paginate)->all();
       }
       //отправляем все в view
       $revisions = new Paginator($sliced, count($records), $paginate, $page);
       //не забываем поправить путь ссылок в постраничной навигации
       $revisions = $revisions->setPath('/revisions');
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
ivankomolin
@ivankomolin
SELECT
    user_id, revisionable_id, COUNT(*) 
FROM 
    table 
GROUP BY 
    CONCAT(user_id, "-", revisionable_id)
Ответ написан
Комментировать
megafax
@megafax
web-программист
Могу посоветовать разве что хранимую процедуру, которая и будет делать нужную Вам таблицу и добавлять дополнительный столбец, который инкрементировать при смене user_id. Тогда сможете сделать group by по новому столбу и по нему же отсортировать. Т.е. у Вас получится что то типа
SELECT `t`.*, COUNT(*) AS `count` FROM my_func() AS `t` GROUP BY `newcol` ORDER BY `newcol`;
А my_func - должен возврщать таблицу путем полного последовательного перебора перебора данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы