当另一个成功时执行查询

时间:2014-02-03 12:04:53

标签: php mysql sql

我希望我的网站访问者只尝试一次测验。我有两张表,questionsattempted_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

但是上面的查询没有用。所以需要帮助来纠正它。其次,如果我的方法真的能提高性能,请告诉我,而不是单独执行这两个查询吗?

3 个答案:

答案 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应该可以正常运行