【问题标题】:User activity feed (ala facebook). How to group similar activities?用户活动提要(ala facebook)。如何对类似的活动进行分组?
【发布时间】:2010-11-06 21:46:54
【问题描述】:

在我正在进行的电影数据库项目中,每个用户都有一个活动源。我想对类似的活动进行分组,例如 Facebook 的做法,但差别不大。

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

我认为最好是在查询数据库时对其进行分组,但我认为在这种情况下这是不可能的,因为我使用了一个非常大的 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 来做到这一点。 谢谢。

【问题讨论】:

    标签: php mysql group-by


    【解决方案1】:

    您可能会根据正在修改的项目的项目 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
    

    【讨论】:

    • 它工作正常,但不是我正在寻找的方式。您提出的方法在分组时会删除所有数据。因此,每个活动我只得到一个结果,因为它合并了所有内容。
    • 需要获取的字段数据可以通过GROUP_CONCAT()函数获取。
    • "你需要获取的字段数据可以通过 GROUP_CONCAT() 函数获取",@ajacian81,你能解释一下吗,如何从 GROUP_CONCAT( ) 也当 GROUP BY 存在时?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多