php - 制作事件日志的最有效方法

标签 php mysql sql

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

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

  1. 创建一个名为“activity”的表,然后每当有人做某事时,就在其中添加一条记录,其中包含操作类型、用户 ID、时间戳等。
    • 问题:表格可能会变得很长。
  2. 加入所有 3 个表格(问题、答案、answer_comments),然后以某种方式按照执行操作的顺序在页面上显示所有这些。
    • 问题:这将非常困难,因为我不知道如何通过加入 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

在此先感谢您的帮助!

最佳答案

为什么会有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

关于php - 制作事件日志的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11129503/

相关文章:

python - 优化表后 MySQL 停止

php - 比较不同表的行

mysql - 如何使用mysql select查询获取下一行中的后续列总数

php - mysql连接查询从两个表中选择行,其中一个表有多行与第一个表匹配

Php pdo rollBack() 不适用于更新语句

PHP Ffmpeg 加入音频文件和视频

Drupal 中的 Mysql 错误 #1064

php - 需要使用 str_replace 或任何其他方式翻译字符串中的单词

sql - 使用选择和覆盖空值插入或更新

php - MySQL:忽略行之间差异大于 x 的结果