制作活动日志的最有效方法

时间:2012-06-20 23:14:17

标签: php mysql sql

我正在为我的网站上的个人资料制作一个“最近活动”标签,而且我还要为主持人提供一个日志,以查看网站上发生的所有事情。这需要制作某种活动日志。

我只是不知道什么会更好。我有两个选择:

  1. 创建一个名为“activity”的表,然后每当有人做某事时,使用action类型,用户ID,时间戳等向其添加记录。
    • 问题:表格可能会很长。
  2. 加入所有3个表格(问题,答案,answer_comments),然后以某种方式按照采取行动的顺序在页面上显示所有这些表格。
    • 问题:这将是非常困难的,因为我不知道如何才能说出“John对问题标题的回答发表评论”只需加入3表。
  3. 有没有人知道在这种情况下制作活动日志的更好方法?我正在使用PHP和MySQL。如果这样效率太低或太难,我可能会忘记配置文件中的“近期活动”选项卡,但我仍然需要主持人的活动日志。

    这是我开始为选项2制作的一些SQL,但这不起作用,因为当我在while循环中回显信息时,无法检测操作是注释,问题还是答案:

    SELECT q.*, a.*, ac.* 
        FROM questions q JOIN answers a ON a.questionid = q.qid
            JOIN answer_comments ac ON c.answerid = a.ans_id
    WHERE q.user = $userid 
    AND a.userid = $userid 
    AND ac.userid = $userid
        ORDER BY q.created DESC, a.created DESC, ac.created DESC
    

    提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我喜欢“选项2”,你基本上会复制你的数据,并且通过额外的读/写会减慢一些事情。也许不是做一个

SELECT q.*, a.*, ac.* 

您可以从每个表中获取所需的数据,或者稍微更简洁的方法是在将查询限制为仅由所选用户的那些帖子后,执行三个表中的Union,并且按发布日期排序。

答案 1 :(得分:1)

为什么你有q.userq.userid

对于选项2(更好的选择IMO - 只要您正确索引),我认为UNION更符合您的要求。像这样:

SELECT 'question' AS action, id, created 
    FROM questions WHERE userid = {$userid}
    UNION
SELECT 'answer' AS action, id, created
    FROM answers WHERE userid = {$userid}
    UNION
SELECT 'comment' AS action, id, created
    FROM answer_comments WHERE userid = {$userid}
ORDER BY created DESC LIMIT 20

'question' / 'answer' / 'comment'告诉您采取了哪些操作。您可能遇到的问题:作为UNION,每个SELECT语句必须具有相同的列数,因此如果一个是短的,您只需添加NULL例如:

SELECT 'comment', id, created, NULL FROM ac

此外,如果其中一个created列的名称不同,则可以使用别名

SELECT 'comment', id, comment_date AS created FROM ac