Intelligent MySQL GROUP BY dla strumieni aktywności

Buduję strumień aktywności dla naszej strony i poczyniłem przyzwoity postęp z czymś, co działa całkiem dobrze.

Jest zasilany dwoma stołami:

strumień:

id - Unikalny identyfikator przesyłki strumieniowejuser_id - Identyfikator użytkownika, który utworzył element strumieniaobject_type - Typ obiektu (obecnie „sprzedawca” lub „produkt”)object_id - Identyfikator wewnętrzny obiektu (obecnie identyfikator sprzedawcy lub identyfikator produktu)action_name - Działanie podjęte przeciwko obiektowi (obecnie „kup” lub „serce”)stream_date - Znacznik czasu, w którym akcja została utworzona.hidden - Wartość logiczna, jeśli użytkownik wybrał ukrycie elementu.

następuje:

id - Unikalny identyfikator śledzeniauser_id - Identyfikator użytkownika inicjującego akcję „Obserwuj”.following_user - ID śledzonego użytkownika.followed - Znacznik czasu, który wykonała akcja śledzenia.

Obecnie używam następującej kwerendy do pobierania zawartości z bazy danych:

Pytanie:

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;

To zapytanie działa naprawdę dobrze i używając małego PHP do analizowania danych, które zwraca MySQL, możemy utworzyć ładny strumień aktywności z akcjami tego samego typu, pogrupowanymi razem przez tego samego użytkownika, jeśli czas między akcjami nie jest zbyt duży (patrz poniższy przykład).

Moje pytanie brzmi: w jaki sposób uczynić to mądrzejszym? Obecnie grupuje według jednej osi „aktywność” użytkownika, gdy w określonym przedziale czasowym jest wiele elementów od określonego użytkownika, MySQL wie, jak je pogrupować.

Jak mogę uczynić to jeszcze bardziej inteligentnym i grupowym według innej osi, takiej jak „object_id”, więc jeśli dla tego samego obiektu w sekwencji występuje wiele akcji, elementy te są zgrupowane, ale zachowujemy logikę grupowania, którą obecnie mamy do grupowania akcji / obiektów przez użytkownika . I wdrożenie tego bez powielania danych?

Przykład wielu obiektów pojawiających się w sekwencji:

Rozumiem rozwiązania problemów takich jak ten, które mogą być bardzo złożone, bardzo szybko, ale zastanawiam się, czy istnieje eleganckie i dość proste rozwiązanie tego problemu (miejmy nadzieję) w MySQL.

questionAnswers(4)

yourAnswerToTheQuestion