Php 如何查询随机行并跟踪已查询的内容(这是最重要的部分)

Php 如何查询随机行并跟踪已查询的内容(这是最重要的部分),php,mysql,Php,Mysql,我已经知道如何进行随机的mysql/php查询,但是如何跟踪已经查询的内容—一行不再被提取。用例:有10个问题的测验。问题的顺序必须是随机的。我如何追踪问题行2、5、6、8、9已经回答,但问题1、3、4、7、10仍然存在。以下是我目前掌握的情况: $current_test = $_SESSION['testid']; // v v v query for this TEST $tests = mysql_query("SELECT * FROM the_tests WHERE the_test

我已经知道如何进行随机的mysql/php查询,但是如何跟踪已经查询的内容—一行不再被提取。用例:有10个问题的测验。问题的顺序必须是随机的。我如何追踪问题行2、5、6、8、9已经回答,但问题1、3、4、7、10仍然存在。以下是我目前掌握的情况:

$current_test = $_SESSION['testid'];
// v v v query for this TEST
$tests = mysql_query("SELECT * FROM the_tests WHERE the_tests.testid=$current_test");
$test = mysql_fetch_array($tests);
// ^ ^ ^ query for this TEST


// v v v query for the QUESTIONS from this Test
// Generate
if ($test['randomize']==1){
    $offset_result = mysql_query("SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM the_questions WHERE the_questions.test_id_q=$current_test");//SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM the_questions WHERE `qid` NOT IN (1,5,6) AND the_questions.test_id_q=1
    $offset_row = mysql_fetch_object($offset_result);
    $offset = $offset_row->offset;
    $questions = mysql_query("SELECT * FROM the_questions WHERE the_questions.test_id_q=$current_test LIMIT $offset, 1 " );
}else{
    $questions = mysql_query("SELECT * FROM the_questions WHERE the_questions.test_id_q=$current_test");
}
$totalQuestions = mysql_query("SELECT * FROM the_questions WHERE the_questions.test_id_q=$current_test");
$totalQs = mysql_num_rows($totalQuestions);
$testQ = mysql_fetch_array($questions);

提前谢谢

您希望用NOT IN 5,23,45来补充SQL WHERE子句

因此,基本上保留一个包含每个随机项ID值的数组,并将其提供给SQL子句

mysql_query("SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM the_questions WHERE the_questions.test_id_q=$current_test AND the_questions.id NOT IN (".implode(',',$excluded).")");
现在,这引发了另一个问题:$excluded数组。这应该是暂时的排除还是永久的排除? 如果它不应该是永久的,则将其存储在会话中,例如:$\u session['excluded'] 如果用户3天后来,他可能会重新回答这个问题

如果这必须是永久性的,那么将该问题已被回答的事实存储在专门针对该问题的专栏中,或者,简单地检查是否有答案

mysql_query("SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM the_questions WHERE the_questions.test_id_q=$current_test AND the_questions.answer ==''");

以下是我的想法:

假设$\u会话['qList']是如下所示的数组:

$_SESSION['qList'] = array(1,2,3,4,5,6,7,8,9,10);
当用户提交问题时,存在一个值为当前问题ID的问题。下面的$eliminateQ是此问题ID:

$_SESSION['qList'] = array_diff($_SESSION['qList'],array($eliminateQ));
$_SESSION['qList'] = array_values($_SESSION['qList']);
$questions = mysql_query("SELECT * FROM tan_questions WHERE test_id_q=$current_test AND qid IN (".implode(',',$_SESSION[qList]).") ORDER BY RAND() LIMIT 1");
这将导致更新的qList数组没有ID号5:

$_SESSION['qList'] = array(1,2,3,4,6,7,8,9,10);
整个过程一直持续到没有问题为止。该实例中有一个if语句,将用户转发到结果页。中提琴


谢谢,@pixeline,谢谢你的洞察力。我把你的“不在”换成了“在”

您可以始终使用会话来存储已回答问题的id。或者,您可以在表中添加另一个字段,当问题得到回答时,您将对其进行更新,并在查询中对其进行限制,以便不包括已回答字段的字段。谢谢pixeline。我想这就是我需要的。它不必是永久性的,应该存储为会话变量。我期待着给它一次机会。嗯,我试过了,但它似乎不起作用,尽管我认为它应该起作用。这里有一个直接的查询,不需要PHP,只需要yucks:选择FLOORRAND*COUNT*作为tan_问题的偏移量,其中tan_问题。test_id_q=1和tan_questions.qid不在1,2,3,4,5中,即使我排除了第1-5行中的查询,它们仍然会显示出来。我被难住了,难道不是这样吗?从tan_问题中选择*,其中qid不在135,1,2,3,4,5,6,7,8,9,10中,按兰德极限0,10排序?