Я создаю поток активности для нашего сайта и добился определенного успеха с чем-то, что работает очень хорошо.
Он работает от двух таблиц:
поток:
-
id
- уникальный идентификатор элемента потока -
user_id
- идентификатор пользователя, создавшего элемент потока -
object_type
- Тип объекта (в настоящее время "продавец" или "продукт" ) -
object_id
- Внутренний идентификатор объекта (в настоящее время либо идентификатор продавца, либо идентификатор продукта) -
action_name
- действие, предпринятое против объекта (в настоящее время "покупка" или "сердце" ) -
stream_date
- отметка времени, в которой было создано действие. -
hidden
- логическое значение, если пользователь решил скрыть элемент.
следует
-
id
- уникальный идентификатор Follow ID -
user_id
- идентификатор пользователя, инициирующего действие "Follow". -
following_user
- идентификатор пользователя. -
followed
- отметка времени, в которой выполнялось следующее действие.
В настоящее время я использую следующий запрос для вывода контента из базы данных:
Query:
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, мы можем создать хороший поток активности с действиями одного и того же типа одним и тем же пользователем, сгруппированным вместе, если время между действиями isn ' t слишком велика (см. пример ниже).
Мой вопрос: как мне сделать это умнее? В настоящее время группа группируется по одной оси, "пользовательская" активность, когда в определенный период времени несколько пользователей задают определенный элемент, который MySQL знает, чтобы сгруппировать их.
Как я могу сделать это еще более умнее и группировать по другой оси, например, "object_id", поэтому, если в последовательности нескольких действий для одного и того же объекта эти элементы сгруппированы, но поддерживайте логику группировки, которую мы в настоящее время имеем для группировки действий/объектов пользователем. И реализовать это без дублирования данных?
Пример нескольких объектов, появляющихся в последовательности:
Я понимаю, что решения таких проблем могут быть очень сложными, очень быстро, но мне интересно, есть ли элегантное и довольно простое решение для этого (надеюсь) в MySQL.