用于活动流的智能 MySQL GROUP BY
我正在为我们的网站构建一个活动流,并且已经取得了一些不错的进展,效果很好。
它由两个表提供支持:
流:
-
id
- 唯一流项目 ID -
user_id
- 创建流项目的用户的 ID -
object_type
- 对象类型(当前为“卖方”或“产品”) -
object_id
- 对象的内部 ID(当前为卖家 ID 或产品 ID) -
action_name
- 对对象采取的操作(目前是“购买”或“心脏”) -
stream_date
- 创建操作的时间戳。 -
hidden
- 用户是否选择隐藏项目的布尔值。
如下:
-
id
- 唯一的关注 ID -
user_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中是否有一个优雅且相当简单的解决方案(希望如此)。