带有连接的SQL SELECT,用于排除用户已经回答的项目

时间:2014-11-06 19:41:38

标签: php html mysql sql database

所以我正在尝试进行某种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等于登录用户,则从结果中排除该项目。如果答案表为空,它可以正常工作,最后不再显示新问题......但如果您随后与其他用户登录,则不会排除任何已回答的问题。

2 个答案:

答案 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库执行它。有时参数的绑定会产生这样的问题。