【问题标题】:Searching for unread posts in a database在数据库中搜索未读帖子
【发布时间】:2011-12-21 06:29:11
【问题描述】:

每次用户阅读帖子时,它都会分配一个 cookie,例如。

set_cookies($id,'read',60*60*24);

但问题是我如何选择用户尚未阅读的所有帖子?

SELECT * from posts where (post is unread)

它不需要登录。表结构:

ID | Content | Category

【问题讨论】:

  • 请给我们一些关于表结构的细节。
  • 你在cookie中到底放了什么? PostID?
  • “每次用户阅读帖子时,它都会分配一个 cookie” 该信息(用户阅读帖子)是否存储在数据库中?
  • 如果您将 postID 放入 cookie 中,那么您将不得不从 cookie 中获取所有这些 id 编号并从 postID 不在的帖子中进行选择(来自 cookie 的 id 列表)

标签: php mysql cookies


【解决方案1】:

使用您的解决方案,您可以执行以下操作:

$ids = array();
if (isset($_COOKIES)) {
    foreach ($_COOKIES as $cookie => $value) {
        if (is_numeric($cookie) && $value == 'read') {
            $ids[] = $cookie;
        }
    }
}

if (isset($ids[0])) {
    $posts = implode(',',$ids);
    $query = "SELECT * from posts where id in ({$posts})";
    // Do the query
} else {
    // no read posts.
}

但是你真的应该考虑以不同的方式存储你的读取变量。

【讨论】:

    【解决方案2】:

    我在这里假设当用户阅读帖子时,帖子的 ID 存储在某处。让我们暂时假设它在表read_posts 中具有以下格式:

    UID | ID 
    

    在这种情况下,您的查询变为:

    SELECT * FROM posts WHERE ID NOT IN (SELECT id FROM read_posts WHERE uid = <user's id>);
    

    如果您只允许顺序读取并将数据存储在同一个表中,则查询会变得更加简单:

    SELECT p.* FROM posts p, read_posts rp WHERE p.ID > rp.ID AND rp.UID = <user id>;
    

    此查询的语法可能略有不同,但我认为总体思路很清楚。

    【讨论】:

      【解决方案3】:

      如果可以创建已读取的 id 列表,是的:

      SELECT * 
      FROM posts 
      WHERE ID NOT IN ($list_of_post_ids_that_have_been_read)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-22
        • 1970-01-01
        • 2018-06-05
        • 2022-11-15
        • 1970-01-01
        • 1970-01-01
        • 2015-11-07
        • 2012-11-23
        相关资源
        最近更新 更多