私は私たちのサイトのアクティビティ ストリームを構築しており、かなりうまく機能するものでかなりの前進を遂げています。
次の 2 つのテーブルを使用します。
ストリーム:
id
- 一意のストリーム アイテム IDuser_id
- ストリーム アイテムを作成したユーザーの IDobject_type
- オブジェクトのタイプ (現在は「販売者」または「製品」)object_id
- オブジェクトの内部 ID (現在、販売者 ID または製品 ID)action_name
- オブジェクトに対して実行されたアクション (現在は「購入」または「ハート」のいずれか)stream_date
- アクションが作成されたタイムスタンプ。hidden
- ユーザーが項目を非表示にすることを選択した場合のブール値。
次のとおりです。
id
- 独自のフォローIDuser_id
- 「フォロー」アクションを開始したユーザーの ID。following_user
- フォローされているユーザーの ID。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 がそれらをグループ化することを認識している特定の時間枠内に特定のユーザーによる複数のアイテムがある場合、「ユーザー」アクティビティという 1 つの軸でグループ化されます。
これをさらにスマートにして、「object_id」などの別の軸でグループ化するにはどうすればよいですか。同じオブジェクトに対して複数のアクションが順番にある場合、これらのアイテムはグループ化されますが、ユーザーごとにアクション/オブジェクトをグループ化するために現在持っているグループ化ロジックを維持します. そして、データの重複なしにこれを実装しますか?
複数のオブジェクトが連続して表示される例:
このような問題の解決策が非常に複雑になり、非常に迅速になる可能性があることは理解していますが、これに対するエレガントでかなり単純な解決策が (できれば) MySQL にあるかどうか疑問に思っています。