3

我有两张表,一张用于主题,一张用于回复。

+------------------+     +------------------+
| forum_topics     |     | forum_posts      |
+------------------+     +------------------+
| topic_id         |     | post_id          |
| topic_title      |     | post_content     |
| topic_contents   |     | post_date        |
| topic_date       |     | topic_id         |
| topic_keywords   |     |                  |
+------------------+     +------------------+

我想要它,所以当用户查看带有主题的页面并阅读该主题时,它会被标记为该特定用户的已读。但是,如果另一个用户来回复该线程,我希望它被标记为自上次访问以来的新帖子或类似的东西。

有任何想法吗?

提前致谢。

4

2 回答 2

2

您可以使用连接到用户和论坛帖子的查找表来执行此操作,如下所示:

当用户查看论坛时,在查找表中输入一行,例如

userID, topic_id, post_id, currentTime

然后要确定用户是否已经阅读过这个论坛,您可以查询该表以查看他们的 userID 是否出现在其中 - 这意味着他们已经阅读过。

然后,您可以将该currentTime列与论坛/线程中的最后一个条目进行比较,看看哪个更大,这将告诉您用户是否看过最后一个帖子。

编辑:是的,您需要在主题和帖子中添加一个日期时间列(无论如何,知道何时发布帖子通常是一种好习惯)以及一些 PHP/SQL:

<?php
$userUpdateTime = gmdate(); // assumed to be either dateTime or unixTimestamp of when user last red the topic/forum
$qry = '
SELECT
    IF(`forum_topics`.`updateDateTime` > "'.$userUpdateTime.'", "unRead", "Read")
FROM
    `forum_topics` ';
于 2012-08-22T13:28:16.717 回答
0

我在论坛上的每个成员表中使用以下每个线程:

CREATE TABLE `forum_thread_member` (
  `thread_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `member_id` smallint(5) unsigned NOT NULL DEFAULT '0',
  `last_post_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `read_flag` bit(1) NOT NULL,
  `posted_flag` bit(1) NOT NULL,
  `new_flag` bit(1) NOT NULL,
  `mark_flag` bit(1) NOT NULL,
  `bookmark_flag` bit(1) NOT NULL,
  `hidden_flag` bit(1) NOT NULL,
  PRIMARY KEY (`thread_id`,`member_id`),
  KEY `bookmark_flag` (`bookmark_flag`)
) 

在查询线程列表时,我在上面留下了 join。如果值为NULL,则该线程尚未被读取。这可以让您准确地知道一个人已经阅读和参与了哪些线程。

last_post_id很有用,因为您可以直观地跳转到并显示该人阅读的最后一篇文章。new_flag设置为1每次有人发帖时,因此很容易用于直观地确定线程列表是否有新的(未读)内容。其他标志用于管理书签、隐藏线程等。

当然,这个表可能会变得很大,但只要没有设置任何重要标志(例如,bookmark_flag),您就可以安全地删除旧记录。如果一个人搜索或浏览旧线程,您可以假设它们已被阅读(而不是假设它们未读,就像您对新线程所做的那样)。

于 2012-08-22T13:37:23.410 回答