我希望我的网站访问者只尝试一次测验。我有两张表,questions
和attempted_students
。
questions
包含测试的所有问题。
attempted_students
包含尝试测试的学生详细信息及其相应的标记。虽然id
字段是主键,但会自动阻止进一步重复插入,但学生可能仍然可以参加考试,只有在提交考试时才会被阻止。
所以如果他的身份证明在attempted_students
表格中,我想给他一个消息'你已经参加了测试'。
要通过将查询减少为1来提高性能,我想组合这样的查询
select if((select count(id) from attempted_students where id=1)>0,(select * from questions),'');
然后我正在使用
if(!empty($rows))
//echo rows
else
//sorry you have taken the test
但是上面的查询没有用。所以需要帮助来纠正它。其次,如果我的方法真的能提高性能,请告诉我,而不是单独执行这两个查询吗?
答案 0 :(得分:0)
我认为你过度优化了。并且在db中设置这样的条件对于加速执行没有帮助(它们是子查询并且它们很慢)。
只需在代码中处理。
select * from attempted_students where id=1
if(empty($rows)){
select * from questions
echo(rows)
} else {
//sorry you have taken the test
}
答案 1 :(得分:0)
如果,case一次只能在一个操作数上使用,并且可以返回一个值。
B / c您的子查询结果不止一个结果,因此它们将始终返回错误。
http://dev.mysql.com/doc/refman/5.6/en/control-flow-functions.html
您可以通过创建存储过程来实现此目的,并且您可以编写if else阻止,并且您将获得所需的流程。
和其他选项是在php中执行,仅在第一个查询结果为正时执行第二个查询。
选择查询中使用的IF 是一个函数,而不是块状态。
答案 2 :(得分:0)
您可以简单地join表格:
SELECT q.* FROM questions q
JOIN attempted_students s ON s.id = q.student_id
如果要进行优化,将索引设置为q.student_id
应该可以正常运行