Ich baue einen Activity Stream für unsere Seite und habe einige gute Fortschritte gemacht mit etwas, das ziemlich gut funktioniert.Intelligentes MySQL GROUP BY für Activity Streams
Es wird von zwei Tabellen mit Strom versorgt:
Strom:
id
- einzigartiges Stream-Item IDuser_id
- ID des Benutzers, der den Stream Artikel erstelltobject_type
- Type des Objekts (derzeit "Verkäufer" oder "Produkt")object_id
- Interne ID des Objekts (derzeit entweder der Verkäufer-ID oder das ID-Produkt)action_name
- die Maßnahmen gegen das Objekt (derzeit entweder ‚kaufen‘ oder ‚Herz‘)stream_date
- Zeitstempel, dass die Aktion war erstellt.hidden
- Boolescher Wert, wenn der Benutzer das Element ausgeblendet hat.
folgt:
id
- Einzigartige Folgen IDuser_id
- Die ID des Benutzers, der die 'Folgen' Aktion.following_user
- Die ID des Benutzers, der verfolgt wird.followed
- Zeitstempel, dass die Folgeaktion ausgeführt wurde.
Derzeit verwende ich die folgende Abfrage Inhalt aus der Datenbank zu ziehen:
Abfrage:
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;
Diese Abfrage ist eigentlich ziemlich gut funktioniert, und ein wenig mit PHP zu analysieren die Daten, die MySQL zurückgibt, können wir einen netten Activity Stream mit Aktionen des gleichen Typs erstellen, indem derselbe Benutzer gruppiert wird, wenn die Zeit zwischen den Aktionen nicht zu groß ist (siehe unten).
Meine Frage ist, wie kann ich diese schlauer? Derzeit gruppiert es um eine Achse, "Benutzer" Aktivität, wenn es mehrere Elemente von einem bestimmten Benutzer innerhalb eines bestimmten Zeitrahmens gibt, weiß die MySQL sie zu gruppieren.
Wie kann ich dies noch intelligenter und gruppieren durch eine andere Achse, wie "object_id", also wenn mehrere Aktionen für das gleiche Objekt in Folge sind diese Elemente gruppiert, aber die Gruppierungslogik, die wir derzeit für die Gruppierung von Aktionen haben/Objekte nach Benutzer. Und das ohne Datenduplikation?
Beispiel mehrerer Objekte in der Reihenfolge erscheinen:
I Lösungen für Probleme wie diese verstehen können sehr komplex, sehr schnell, aber ich frage mich, ob es ein elegantes und ziemlich einfache Lösung das (hoffentlich) in MySQL.
Argh. Das falsche MySQL-Feature namens "GROUP BY" (verborgene Spalten) erschwert es Ihnen, Ihre Abfrage zu verstehen. Es macht es anderen schwer, es zu verstehen. Siehe hierzu: http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html –
Wie möchten Sie, dass etwas gruppiert wird, wenn ein einzelner Nutzer mehr Dinge kauft, aber einen (oder mehrere)) dieser Produkte sind auch gruppiert? EG in deinem letzten Beispiel, was ist, wenn Chrision auch Treehouse Gold gekauft hat? Würde es zu seiner Gruppe, zur Baumhausgruppe oder zu beiden hinzugefügt werden? –
@HugoDelsing Neben der Gruppierung ähnlicher Aktionen durch denselben Benutzer sollten auch Elemente gruppiert werden, die von verschiedenen Benutzern nebeneinander angezeigt werden und in denen diese Elemente noch nicht gruppiert sind. Z.B. Da Joe, India und Walt im obigen Beispiel Treehouse gekauft haben und diese nahe beieinander liegen, sollten diese gruppiert werden, obwohl sie von verschiedenen Benutzern stammen. –