如何获取随机未读文章?

时间:2015-11-14 18:15:10

标签: sql database random backendless

数据库表articles包含10.000行(文章) 我想得到一篇随机文章,将其标记为已读并且永远不会再次获得, 所以我的下一个get请求应该返回除了那个之外的随机文章。 像我这样的成千上万的用户都在使用这个表。

我该如何实现?如何标记这些文章,以及如何仅搜索未读文章?

我试图在relatedUsers表中创建列Articles,该列填充了与读取该文章的用户对象的关系。我正在使用搜索查询:relatedUsers.objectId!=currentUserId但是当此列获得2+ relatedUsers时,此解决方案停止工作,因为数据库返回的文章至少有一个relatedUser,其objectId不等于currentUserId (表示所有用户)。

我现在正在使用Backendless.com,但如果我猜,该解决方案应该适用于任何数据库,包括backendless。如果没有,那么我应该使用哪种数据库?

2 个答案:

答案 0 :(得分:2)

你现在可以做的是:

  1. 使用字段UserArticlearticleId
  2. 创建名为userId的表格
  3. 当您添加用户或文章时,您还应该将此表关系分别添加到所有文章或用户;这样,您的UserArticle表将包含文章和尚未阅读这些文章的用户之间的关系
  4. 为了获得用户随机不读的文章,您:
    1. UserArticle userId = yourCurrentUserId
    2. 中检索项目
    3. 随机选择其中一个,并按ID
    4. 检索文章
    5. UserArticlearticleId移除userId中的所选文章,表示该用户已阅读该文章
  5. 这种方法最适合您的情况。它涉及多个请求,但目前您的要求不能更好。

    此外,我们(Backendless团队)正在开发一个像contains这样的关键字,使用它可以只与Users表有关系并且不会在一个请求中读取文章,所以建议的方法是很暂时。

答案 1 :(得分:1)

获取随机数取决于数据库。但基本的想法是有一个名为UserArticles的表,每个用户一行,每篇文章已经读过(可能还有其他信息,如时间)。

然后,你可以这样做:

select a.*
from articles a
where not exists (select 1
                  from userarticles ua
                  where a.article_id = ua.article_id and ua.user_id = $user_id
                 ) 
order by rand()
limit 1;

order by rand() limit 1肯定与数据库有关。但是,它让您了解如何解决问题。

选择文章后,您将此信息插入UserArticles

insert into UserArticles(user_id, article_id)
    values ($user_id, $article_id);

其中$article_id指的是上一步中检索到的文章。

注意:对于竞争条件,这应该没问题,除非单个用户可以同时与数据库建立多个连接,要求提供相同的信息。处理该案例需要更多地了解正在使用的数据库。