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.