douxiduan8344 2010-11-06 21:46
浏览 72
已采纳

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

In a movies DB project I'm working on, each user have an activity feed. I want to group similar activities, like how Facebook does it but little different.

For example if an user writes a review for a movie, and one minute later he also votes for that movie and 5 minutes later he upload a trailer for that movie, I want to show it together (grouped) in the activity feed.

I think the best is to group it when querying the database but I don't think its possible in this case because I use a really big JOIN to get all the data:

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

I want to know how to do it either by modifying the query or using PHP. Thanks.

  • 写回答

1条回答 默认 最新

  • dongrang2186 2010-11-07 09:40
    关注

    You'd likely group on the item id of the item being modified - which in this case looks like: ua.imdbID.

    Once you do that, you'll lose out on the other rows of data, so you'd use GROUP_CONCAT to get all related IDs.

    GROUP_CONCAT(sa.activityID);

    So your end result would be:

    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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记