【问题标题】:Most efficient way to make an activity log制作活动日志的最有效方法
【发布时间】:2012-06-21 11:13:41
【问题描述】:

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

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

  1. 制作一个名为“活动”的表,然后每次有人做某事时,添加一条记录,其中包含操作类型、用户 ID、时间戳等。
    • 问题:表格可能会变得很长。
  2. 加入所有 3 个表格(问题、答案、answer_cmets),然后以某种方式在页面上按照执行操作的顺序显示所有这些。
    • 问题:这将是非常困难的,因为我不知道如何才能说“John 在此处对问题标题的答案发表了评论”,只需加入 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

提前感谢您的帮助!

【问题讨论】:

    标签: php mysql sql


    【解决方案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
    

    【讨论】:

    • 抱歉,第二个实际上应该是a.userid(这是一个错字)。总之非常感谢!我要试试这个,如果它有效,我会接受你的回答:D 感谢你用这种方式来识别它是评论、问题还是答案,因为我从来不知道你能做到这一点。
    • 这非常有效:) 我只是在加入问题表以获取问题信息时遇到了一个小问题,以便可以将其链接起来。这是 SQL 和 PHP:screencast.com/t/EJgdGkMPBB 出于某种原因,在 cmets 上似乎将问题 id 显示为标题,然后对于答案,它根本没有显示标题:screencast.com/t/qvDzliDs9U 我知道有些stuff 还没有像 $row['qSlug'] 和 stuff(这是标题的 URL slug),但这不应该影响其他的东西。
    • 关联键的名称来自first SELECT。您应该首先选择所有公共列 (id, created, q_id, q_title),然后最后选择不同的列 (a.ans_idac.id)。这不是缺陷——UNION 是为选择相同的数据而设计的。至于空白标题,您使用的是qTitle 而不是q_title
    • 这有帮助吗?我将不胜感激“接受”,或者如果您仍然遇到问题,我很乐意提供帮助
    • 我接受了。感谢您的帮助,这是一个很好的解决方案,比为活动日志制作一个完整的表格要好得多。
    【解决方案2】:

    我喜欢“选项 2”,您基本上会复制您的数据,并且由于额外的读/写操作会减慢速度。也许不是做一个

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

    您可以只从每个表中获取您需要的数据,或者更简洁的方法可能是在将您的查询限制为所选用户的那些帖子之后,对三个表执行 Union,然后按以下顺序排序发布日期。

    【讨论】:

    • 这看起来是个好主意,但在 while 循环中,我如何检测该操作是答案、问题还是评论?如果我能做到这一点,那么这将起作用,我可以说:“{User}评论了关于问题标题的答案”,如果它是评论,然后“{User}问问题标题”如果它是一个问题,等等。跨度>
    • 你可以为类型添加一个变量,例如在每个选择语句中抛出一个字符串来说明它是什么:选择'question'作为activity_type,q.field1等来自...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多