6

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

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

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

有谁知道在这种情况下制作活动日志的更好方法?我正在使用 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

提前感谢您的帮助!

4

2 回答 2

1

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

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

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

于 2012-06-20T23:27:36.577 回答
1

为什么你有q.userand q.userid

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

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'告诉您采取了哪些操作。您可能遇到的可能问题:作为 a UNION,每个SELECT语句必须具有相同数量的列,所以如果一个很短,您可以添加一个NULLeg:

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

此外,如果其中一created列具有不同的名称,您可以只使用别名

SELECT 'comment', id, comment_date AS created FROM ac
于 2012-06-21T02:33:07.887 回答