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 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算