用户活动Feed(ala facebook)。如何组织类似的活动?

时间:2010-11-06 21:46:55

标签: php mysql group-by

在我正在处理的电影数据库项目中,每个用户都有一个活动源。我想将类似的活动分组,比如Facebook如何做,但差别不大。

例如,如果用户为电影撰写评论,一分钟后他也投票支持该电影,5分钟后他上传了该电影的预告片,我想在活动Feed中一起显示(分组)

我认为最好是在查询数据库时对其进行分组,但在这种情况下我认为不可能,因为我使用了非常大的JOIN来获取所有数据:

SELECT ua.datetime, ua.imdbID, ua.personID, sa.activityID, sa.activity, m.title, m.year, p.name, umv.vote, upv.vote, r.review, t.youTubeID, ps.filename, ph.filename
FROM user_activity ua
JOIN sys_activities sa ON ua.activityID = sa.activityID
LEFT OUTER JOIN movies m ON ua.imdbID = m.imdbID
LEFT OUTER JOIN persons p ON ua.personID = p.personID
LEFT OUTER JOIN user_movies_vote umv ON umv.userID = ua.userID AND umv.imdbID = ua.imdbID
LEFT OUTER JOIN user_persons_vote upv ON upv.userID = ua.userID AND upv.personID = ua.personID
LEFT OUTER JOIN reviews r ON r.userID = ua.userID AND r.imdbID = ua.imdbID
LEFT OUTER JOIN (
        select imdbID, userID, youTubeID, max(hd) as MaxTrailerStatus
        from trailers
        group by imdbID
        ) t ON ua.imdbID = t.imdbID AND ua.userID = t.userID
LEFT OUTER JOIN (
        select imdbID, filename, max(main) as MaxPosterStatus
        from posters
        group by imdbID
        ) ps ON ua.imdbID = ps.imdbID
LEFT OUTER JOIN (
        select personID, filename, max(main) as MaxPhotosStatus
        from photos
        group by personID
        ) ph ON ua.personID = ph.personID
WHERE ua.userID = ?
ORDER BY ua.datetime DESC

我想知道如何通过修改查询或使用PHP来实现。 感谢。

1 个答案:

答案 0 :(得分:3)

您可能会对要修改的项目的项目ID进行分组 - 在这种情况下看起来像:ua.imdbID。

一旦这样做,您将失去其他数据行,因此您将使用GROUP_CONCAT获取所有相关ID。

GROUP_CONCAT(sa.activityID);

所以你的最终结果是:

SELECT ua.datetime, ua.imdbID, ua.personID, GROUP_CONCAT(sa.activityID), sa.activity, m.title, m.year, p.name, umv.vote, upv.vote, r.review, t.youTubeID, ps.filename, ph.filename
FROM user_activity ua
JOIN sys_activities sa ON ua.activityID = sa.activityID
LEFT OUTER JOIN movies m ON ua.imdbID = m.imdbID
LEFT OUTER JOIN persons p ON ua.personID = p.personID
LEFT OUTER JOIN user_movies_vote umv ON umv.userID = ua.userID AND umv.imdbID = ua.imdbID
LEFT OUTER JOIN user_persons_vote upv ON upv.userID = ua.userID AND upv.personID = ua.personID
LEFT OUTER JOIN reviews r ON r.userID = ua.userID AND r.imdbID = ua.imdbID
LEFT OUTER JOIN (
        select imdbID, userID, youTubeID, max(hd) as MaxTrailerStatus
        from trailers
        group by imdbID
        ) t ON ua.imdbID = t.imdbID AND ua.userID = t.userID
LEFT OUTER JOIN (
        select imdbID, filename, max(main) as MaxPosterStatus
        from posters
        group by imdbID
        ) ps ON ua.imdbID = ps.imdbID
LEFT OUTER JOIN (
        select personID, filename, max(main) as MaxPhotosStatus
        from photos
        group by personID
        ) ph ON ua.personID = ph.personID
WHERE ua.userID = ?  GROUP BY ua.imdbID


ORDER BY ua.datetime DESC