仅显示表的结果,而其他表中没有某些变量组合?

时间:2019-07-17 09:23:14

标签: mysql

我想构建一个系统,用户可以在其中提交测验问题,用户也可以对这些问题进行评分。

有两个与我的问题有关的表:

  • “问题”,其中包含问题ID,用户ID(来自 提交问题),正确答案,错误答案,另一个 错误的答案以及当问题出现时设置为true的布尔值 在验证过程中幸存下来。
  • “验证”,其中包含用于验证问题的QuestionID,用于用户验证问题的UserID和验证(0, 1或2,具体取决于用户对该问题的评分。

要向用户提供需要评分的问题,我需要一个MySQL查询,并收到一个问题:

  • 尚未通过验证(验证的布尔=假)
  • 不是由用户请求的
  • 尚未被用户请求验证
  • 具有这些因素的结果列表中的第一个问题

编辑:我找到了解决方法,请看底部的编辑。

我尝试了以下查询:

set @UserId=5;

SELECT q.id, q.question, q.correct_answer, q.wrong_answer1, q.wrong_answer2
FROM question q 
LEFT JOIN validation v ON v.question_id=q.id 
WHERE q.validated = 0 
AND q.user_id!=@UserId 
AND v.user_id!=@UserID 
ORDER BY q.id 
LIMIT 1
  • 我排除了已经通过WHERE q.validated = 0验证的问题。
  • 我确定这是ORDER BY q.id LIMIT 1结果列表中的第一个问题
  • 我排除了用户通过q.user_id!= @ UserId
  • 提出的问题

该查询什么也不返回。 问题表包含一些未验证的问题。验证表为空。

我知道错误出在LEFT JOIN验证v ON v.question_id = q.id和v.user_id!=@UserID部分之内,但是我不知道如何将自己的意愿翻译成MySQL。 >

编辑:我找到了解决我问题的解决方案:

set @UserId=5;

SELECT q.id, q.question, q.correct_answer, q.wrong_answer1, q.wrong_answer2 FROM question q 
WHERE NOT EXISTS 
    (SELECT * FROM validation v WHERE v.user_id=@UserID AND q.id = v.question_id) 
AND q.validated = 0 AND q.user_id!=@UserId

但是,我读到这种方法对性能非常不利。 有更高效的方法吗?

1 个答案:

答案 0 :(得分:1)

您必须在v.user_id中检查是否为空,因为没有条目。 此查询有效:

set @UserId=5;
SELECT q.id, q.question, q.correct_answer, q.wrong_answer1, q.wrong_answer2
FROM question q 
LEFT JOIN validation v ON v.question_id=q.id 
WHERE q.validated = 0 
AND q.user_id!=@UserId 
AND v.user_id is null or v.user_id!=@UserId
ORDER BY q.id 
LIMIT 1