繁体   English   中英

不重复用户正确回答的问题的问题数据库

[英]Question database that doesn't repeat questions that were answered correctly by user

我有一个问题表,如下所示:

    ID | question            | a    | b     | c    | d      | e     | correct_item
    1  | What's my name?     | joao | pedro | jose | mateus | lucas | b
    2  | How old am I?       | 15   | 18    | 20   | 22     | 25    | d
    3  | Where are you from? | Paris| Berlin| Tokyo| Nairobi| Rio   | d

当用户访问他的个人资料页面时,有一个modal按钮,可以从数据库中选择一个随机问题。

$busca_questoes = "SELECT * FROM questoes ORDER BY rand() LIMIT 1";
$result_questoes = mysqli_query($conexao, $busca_questoes);
$questoes = mysqli_fetch_array($result_questoes);

我想知道的是:

  1. 如何随机排序问题,但是,在向用户显示问题之前,我想检查用户是否已经正确回答了这个问题,如果是,则给 select 一个新问题;

首先,我尝试构建第二个表来集成用户数据库和问题数据库。 代码如下:

id_table | id_question | id_user | correct
1        | 1           | 2       | yes
2        | 2           | 2       | no
3        | 1           | 1       | yes

但我发现这种策略的问题是,几乎必须手动将每个问题与用户关联起来。 当用户注册到网站时我可以这样做,但是当添加新问题时我应该怎么做?

现在我不知道该怎么做才能解决这个问题。 如果需要更多信息,请告诉我。

正如 Shadow 所评论的那样,您希望存储已经向每个用户提出的问题,无论他们是否给出了正确的答案。 您不需要存储他们尚未回答的问题。

然后,您可以使用以下查询来提取尚未向给定用户询问的随机问题:

SELECT * 
FROM questions q
WHERE NOT EXISTS (
    SELECT 1
    FROM user_questions uq
    WHERE uq.id_user = :id_user AND uq.id_question = q.id_question
)
ORDER BY rand() LIMIT 1

其中参数:id_user是当前用户的 id。

为此,您需要大量问题,因为一旦用户查看了所有可能的问题,上述查询将返回一个空结果集。 或者,您可以将每个问题的询问日期存储在user_questions表中,并在子查询中添加过滤器以仅排除最近看到的问题。

SELECT * 
FROM questions q
WHERE NOT EXISTS (
    SELECT 1
    FROM user_questions uq
    WHERE 
        uq.id_user = :id_user 
        AND uq.id_question = q.id_question
        AND uq.date_asked > NOW() - INTERVAL 30 DAY
)
ORDER BY rand() LIMIT 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM