Интеллектуальный 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 элегантное и довольно простое решение для этого (надеюсь).