Интеллектуальный MySQL GROUP BY для потоков активности

Я создаю поток активности для нашего сайта, и добился некоторого приличного прогресса с чем-то, что работает довольно хорошо.

Работает на двух столах:

ручей:

id - Уникальный идентификатор элемента потокаuser_id - идентификатор пользователя, который создал элемент потокаobject_type - Тип объекта (в настоящее время «продавец» или «продукт»)object_id - Внутренний идентификатор объекта (в настоящее время либо идентификатор продавца, либо идентификатор продукта)action_name - Действие, предпринятое против объекта (в настоящее время либо «купить», либо «сердце»)stream_date - Отметка времени, что действие было создано.hidden - Логическое значение, если пользователь решил скрыть элемент.

следует:

id - Уникальный идентификатор подпискиuser_id - Идентификатор пользователя, инициирующего действие «Подписаться».following_user - Идентификатор пользователя, которому следуют.followed - Отметка времени, когда было выполнено следующее действие.

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

Запрос:

SELECT stream.*,
   COUNT(stream.id) AS rows_in_group,
   GROUP_CONCAT(stream.id) AS in_collection
FROM stream
INNER JOIN follows ON stream.user_id = follows.following_user
WHERE follows.user_id = '1'
  AND stream.hidden = '0'
GROUP BY stream.user_id,
     stream.action_name,
     stream.object_type,
     date(stream.stream_date)
ORDER BY stream.stream_date DESC;

Этот запрос на самом деле работает довольно хорошо, и с помощью небольшого PHP для анализа данных, которые возвращает MySQL, мы можем создать хороший поток действий с действиями одного и того же типа, объединенными одним и тем же пользователем, если время между действиями не слишком велико (см. пример ниже).

У меня вопрос, как мне сделать это умнее? В настоящее время он группирует по одной оси, «пользовательская» активность, когда конкретный пользователь в течение определенного периода времени имеет несколько элементов, которые MySQL знает для их группировки.

Как я могу сделать это еще умнее и группировать по другой оси, например, «object_id», чтобы, если есть несколько действий для одного и того же объекта в последовательности, эти элементы сгруппированы, но сохраняют логику группировки, которую мы в настоящее время имеем для группировки действий / объектов пользователем , И реализовать это без дублирования данных?

Пример нескольких объектов, появляющихся в последовательности:

Я понимаю, что решения таких проблем могут быть очень сложными, очень быстрыми, но мне интересно, есть ли в MySQL элегантное и довольно простое решение для этого (надеюсь).

Ответы на вопрос(4)

Ваш ответ на вопрос