按日期 MYSQL 在活动流中排序分组


Order Group By in Activity Stream by Date MYSQL

我从这里尝试了很多解决方案,但没有一个能解决我的问题!我有以下表格结构:

|Column|Type|
|------
|activity_id| int(10) PRIMARY
|user_id| int(10)
|type| varchar(255)
|activity| varchar(255)
|item_id| int(11)
|secundary_id| int(11)
|date| datetime

我正在构建一个活动流,在此表中我将记录如下

"约翰 (user_id) 评论 (活动) 一个帖子 (类型 => item_id) 5 小时前 (日期)"

我打算做以下结构:

"约翰,玛丽和 +2 在 5 小时前评论了一篇文章"

到目前为止,我能够进行此连接,但我无法按日期成功对记录进行排序。我在自己的表中尝试了一些内部联接,但因此我无法检索未按(类型,活动,item_id)分组的其他活动类型,例如:

"约翰 ( user_id) 发布 (活动) 帖子(类型 => item_id ) 5 小时前 (日期)"

当我使用 JOIN 时,我只得到按记录分组的。这是我的实际查询:

SELECT t.*, GROUP_CONCAT(DISTINCT user_id ) AS users FROM (
SELECT *
FROM activity
   ORDER BY date DESC 
)t
GROUP BY type, activity, item_id
ORDER BY date DESC

我已经尝试了此处列出的一些解决方案:选择一列值不同的 3 条最新记录但是当我加入表格时,我丢失了非分组记录!有人有其他想法吗?谢谢!

/** 编辑 - 结果

activity_id     user_id     type    activity    item_id     secundary_id    date    users
865         32  update  comment     20  22  2013-10-29 15:03:49     32,34
858         36  update  post    20  NULL    2013-10-29 13:50:59     36
864         32  post    comment     2615    21  2013-10-29 14:55:58     32,34,36
856         36  post    comment     2616    14  2013-10-29 13:50:10     36,39,34,32
872         32  post    comment     2617    28  2013-10-29 15:46:20     32
852         34  post    post    2615    NULL    2013-10-29 13:47:25     34
854         32  post    post    2616    NULL    2013-10-29 13:49:13     32
870         32  post    post    2617    NULL    2013-10-29 15:36:57     32

这就是我通过上面的查询得到的,但是例如,具有 2616 条用户评论的 item_id 4 不是按最后一个用户评论日期排序的,例如我有以下记录:

activity_id user_id type activity item_id secundary_item date
856     36  post    comentar    2616    14  2013-10-29 14:05:10

他的日期是 14:05,但在我选择时,我得到了另一个较早的评论日期!

--小提琴

http://sqlfiddle.com/#!2/1923d2/1


由@Tom解决

如果您想获取最近的日期,请尝试以下操作:

源语言

SELECT   activity_id, user_id, type, activity, item_id, secundary_id, MAX(date) date, 
         GROUP_CONCAT(DISTINCT user_id ) AS users 
FROM     activity
GROUP BY type, activity, item_id
ORDER BY date DESC

已编辑 - 下面将为您提供每个分组的最新记录。

SELECT   activity_id, user_id, type, activity, item_id, secundary_id, date, 
         users
FROM     activity a
         JOIN ( SELECT   MAX(activity_id) max_activity_id,
                         GROUP_CONCAT(DISTINCT user_id ) AS users
                FROM     activity
                GROUP BY type, activity, item_id
              ) AS grp ON a.activity_id = grp.max_activity_id
GROUP BY date DESC