Интеллектуальный 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.