我有两个表,一个用于主题,另一个用于回复。
+------------------+ +------------------+
| forum_topics | | forum_posts |
+------------------+ +------------------+
| topic_id | | post_id |
| topic_title | | post_content |
| topic_contents | | post_date |
| topic_date | | topic_id |
| topic_keywords | | |
+------------------+ +------------------+我希望它是这样的,当用户查看带有该主题的页面并阅读该主题时,它被标记为该特定用户的已读。但是如果另一个用户来回复这个帖子,我希望它被标记为自上次访问以来的新帖子或类似的东西。
有什么想法吗?
提前谢谢。
发布于 2012-08-22 21:28:17
您可以使用连接到用户和论坛帖子的查找表来执行此操作,如下所示:
当用户查看论坛时,在查找表中输入一行,如下所示
userID, topic_id, post_id, currentTime然后,要确定用户是否已经阅读了此论坛,您可以查询表,查看他们的userID是否出现在其中-这意味着他们已经阅读了该论坛。
然后,您可以将currentTime列与论坛/线程中的最后一个条目进行比较,看看哪个更大,哪个更大,这将告诉您用户是否看到了最后一篇文章。
编辑:是的,您需要在主题和帖子中添加一个datetime列(无论如何,知道帖子是什么时候发布的通常是一个好的实践),并且对于一些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-22 21:37:23
我在我的论坛上使用了以下每个线程每个成员的表格:
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),您就可以安全地删除旧记录。如果一个人搜索或浏览旧的线程,你可以假设它们已经被读取了(而不是假设它们是未读的,就像你对新线程所做的那样)。
https://stackoverflow.com/questions/12074187
复制相似问题