所以我正在尝试进行某种webapp测验。 人们可以将自己的问题提交到数据库,并可以进行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);
}
获得一个不违反上述规则的新问题。 我的数据库布局是:
问题
-id
-quest
-answ
-uploader_id
答复
-id
-question_id
-user_id
-answered(1/0 true false)
这对第一个用户来说很好用,他只会得到唯一且没有答案的问题。但是只要第二个用户记录,我认为该命令正在做的是: 他在answers表中找到了question_id,看到一个不同的user_id并停止检查并且只是允许返回该问题,即使他也回答了问题但sql从不检查。 ?那么是否有一种方法可以检查答案表中是否有1个条目同时具有等于问题ID的question_id和等于$ userid的user_id(= $ _ SESSION ['user'] ['id'])
有没有办法解决这个问题,编写另一个SELECT查询或以不同的方式执行,php也许?...(返回10个问题的数组也没关系。)
[发明内容]
它检查了答案表中带有问题ID的每个项目,如果其中一个项目的user_id等于登录用户,则从结果中排除该项目。如果答案表为空,它可以正常工作,最后不再显示新问题......但如果您随后与其他用户登录,则不会排除任何已回答的问题。
答案 0 :(得分:1)
您需要比较answer
条款中的userid
' ON
。
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
。
基本上,这就是说,"给我所有留下的问题和我们用户的答案(忽略其他人的答案)。然后扔掉我们用户上传的问题,扔掉有答案的问题。"
这样可以为您留下您想要的内容 - 您的用户未上传或回答的问题。
答案 1 :(得分:0)
使用PHP的PDO库创建连接可能存在问题,我建议编写简单的连接查询并通过my_sqli库执行它。有时参数的绑定会产生这样的问题。