我正在为我们的网站构建一个活动流,并且在一些运行良好的东西上取得了不错的进展。
它由两个表提供支持:
流:
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 知道将它们分组。
我怎样才能使它更智能并按另一个轴分组,例如“object_id”,所以如果按顺序对同一个对象有多个操作,这些项目将被分组,但保持我们当前用于按用户分组操作/对象的分组逻辑. 并在没有数据重复的情况下实现这一点?
多个对象依次出现的示例:
我了解此类问题的解决方案可能会变得非常复杂,非常迅速,但我想知道在 MySQL 中是否有一个优雅且相当简单的解决方案(希望如此)。