使用设置参数选择“随机”结果

时间:2010-09-10 10:49:29

标签: php mysql

我正在开发一个系统,从数据库中选择问题以生成测试/考试。

每个问题都有一个'问题类型'(' q_type ')。我有一个问题数据库,需要选择4个问题,每个问题都有不同的'q_type'。

目前选择4个随机问题的基本查询是:

SELECT * FROM questions ORDER BY RAND() LIMIT 0,4

这显然没有考虑到每个问题应该有不同的'q_type'这一事实。

我希望能够做出符合这种逻辑的事情(我需要填写方括号):

SELECT * FROM questions WHERE ['q_type' is DISTINCT] ORDER BY RAND() LIMIT 0,4

我尝试过使用GROUP BY'q_type',但这只是为每个'q_type'提出了第一个问题,而不是每次都是该类型的不同问题。

任何帮助都会很棒,因为我现在完全被困住了(我正在使用过度的PHP循环,只需查询数据库4次,每次更新WHERE'q_type'!= XX)。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我认为通过简单查询可以轻松实现此目的。您可以使用mysql存储过程来完成它,或者在php中保存一些开发时间。

如果问题池不是非常大,并且这不是经常发生的事情,那么您应该可以使用4个单独的查询(每个q_type一个),或者甚至可以获得整个问题集进入php,然后玩它来获得4个随机问题,每个q_type一个。

使用以下(未经测试的)代码,您将获得随机排序的所有问题并循环遍历它们以获得每个q_type的第一个问题,然后停止。这不是最优雅的解决方案,但同样,对于足够小的数据集和频率,它应该没问题。

$questions = array() ;
$res = mysql_query('SELECT * FROM questions ORDER BY RAND()') ;
while ($row = mysql_fetch_assoc($res)) {

    //if we have all 4, stop
    if (count($questions) == 4) {
        break ;
    }

    $currType = $row['q_type'] ;
    $currQuestion = $row['questionTitle'] ;

    if (isset($questions[$currType])) {
        //already have it, continue to the next
        continue ;
    }

    $questions[$currType] = $currQuestion ;

}

答案 1 :(得分:0)

我绝不是SQL专家,但这有用吗?

SELECT DISTINCT `q_type`, * FROM questions ORDER BY RAND() LIMIT 0, 4