gpt4 book ai didi

php - 带连接的 SQL SELECT 可排除用户已回答的项目

转载 作者:行者123 更新时间:2023-11-29 12:36:00 24 4
gpt4 key购买 nike

所以我正在尝试进行某种网络应用程序测验。人们将能够向数据库提交自己的问题,并能够参加 10 个随机对/错问题的测验。

我想编写一个 sql select 来获取以下问题:

1- 未由登录用户上传

2- 登录用户尚未回答

目前我有这个:($userid = 登录用户 ID)

        public function selectNewRandom($userid){

$sql = "SELECT `questions`.`id`, `questions`.`quest`, `questions`.`answ`, `questions`.`uploader_id`,`answers`.`item_id`, `answers`.`user_id` FROM `questions` LEFT JOIN `answers` ON `questions`.`id` = `answers`.`question_id` WHERE `questions`.`uploader_id` != $userid AND (`answers`.`user_id` IS null OR `answers`.`user_id` != $userid) ORDER BY RAND()";
$stmt = $this->pdo->prepare($sql);
$stmt->bindValue(':id', $id);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
}

获得 1 个不违反上述规则的新问题。我的数据库布局是:

问题

-id

-任务

-答案

-uploader_id

答案

-id

-question_id

-user_id

-已回答(1/0 正确错误)

这对于第一个用户来说效果很好,他只会得到独特且未回答的问题。但是一旦第二个用户登录,我认为该命令正在做的是:他在answers表中找到question_id,看到不同的user_id并停止检查并只允许返回该问题,即使他也回答了该问题但sql从不检查。 ?那么是否有一种方法可以检查答案表中是否没有 1 个条目同时具有等于问题 id 的 Question_id 和等于 $userid (=$_SESSION['user']['id']) 的 user_id

有没有办法解决这个问题,编写另一个 SELECT 查询或以不同的方式执行它,也许是 php?..(返回 10 个问题的数组也可以..)

[摘要]

它会检查答案表中带有问题 id 的每个项目,如果其中一个项目的 user_id 等于登录用户,则从结果中排除该项目。如果回答的表为空,则工作正常,最终不再显示新问题...但如果您随后使用其他用户登录,则不会排除已回答的任何问题。

最佳答案

您需要在 ON 子句中比较 answeruserid

SELECT q.`id`, q.`quest`, q.`answ`, q.`uploader_id`, a.`item_id`, a.`user_id`
FROM `questions` q
LEFT JOIN `answers` a
ON q.`id` = a.`question_id` AND a.`user_id` = $userid
WHERE q.`uploader_id` != $userid AND a.`user_id` IS NULL
ORDER BY RAND()

您也可以使用 EXISTS 来编写此内容,但我更喜欢自己使用 JOIN

基本上,这句话的意思是,“给我所有剩下的问题以及我们用户的答案(忽略其他人的答案)。然后扔掉我们用户上传的问题,并扔掉有答案的问题。”

这样您就得到了您想要的内容 - 用户未上传或回答的问题。

关于php - 带连接的 SQL SELECT 可排除用户已回答的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26788030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com