私は、私たちのサイトのアクティビティストリームを構築しています。ユニークなストリームアイテムID インテリジェントなMySQL GROUP BYのアクティビティストリーム
user_id
- - ストリームアイテムobject_type
を作成したユーザーのID - タイプ
id
:ストリーム:
これは、2つのテーブルを搭載していますオブジェクト(現在「売り手」または「商品」)
object_id
- アクションがあったとタイムスタンプ - オブジェクト(現在は「買い」か「心」のいずれか)stream_date
に対して取られるアクション - オブジェクト(現在は販売者のIDやプロダクトIDのいずれか)action_name
の内部IDは、作成した。hidden
- ユーザーがアイテムを非表示にした場合のブール値です。
を、次のとおりです。
id
- ユニークなフォローIDuser_id
- 'フォロー' アクションを開始したユーザーのIDを。following_user
- 追跡されるユーザーのID。followed
- フォローアクションが実行されたタイムスタンプ。
クエリ:このクエリは、実際にはかなりうまく機能し、少しPHPを使用して解析する
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;
MySQLが返すデータは、アクション間の時間があまり大きくなければ、同じユーザーが同じタイプのアクションをグループ化して素晴らしいアクティビティストリームを作成できます(下記の例を参照)。
私の質問は、どのように私はこれは賢く作るのですか?現在、特定のユーザが複数のアイテムを特定の時間枠内に置いているときに、それらをグループ化することを知っている「ユーザ」アクティビティが、1つの軸でグループ化されます。
これを「object_id」などの別の軸でグループ化するにはどうすればよいでしょうか。同じオブジェクトに対して複数のアクションが順番に並んでいる場合、これらのアイテムはグループ化されますが、 /オブジェクトをユーザごとに表示します。データの重複なしにこれを実装しますか?シーケンスに登場する複数のオブジェクトの
例:
私は非常に迅速に、非常に複雑な取得することができ、このような問題の解決策を理解しますが、私はエレガントな、そして非常に単純な解決策があるかどう思ったんだけどこれはMySQLでうまくいきます。
Argh。 "GROUP BY'の隠しカラム"と呼ばれるMySQLの誤った機能は、あなたがあなたのクエリを理解するのを困難にしているかもしれません。それは他人がそれを理解することを困難にする。これを参照してください:http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html –
一人のユーザーがより多くのものを購入したときに、どのようにグループ化するのですか? )もグループ化されていますか?あなたの最後の例では、ChristionもTreehouseの金を買ったとしたら?彼のグループ、ツリーハウスグループ、またはその両方に追加されますか? –
@HugoDelsing同じユーザーが同じようなアクションをまとめてグループ化するだけでなく、グループ化されていないユーザーが互いに近くに見えるアイテムをグループ化する必要があります。例えば。上記の例では、Joe、India、WaltがTreehouseを購入していて、これらは互いに接近しているため、異なるユーザーであってもグループ化する必要があります。 –