我正在开发一个系统,从数据库中选择问题以生成测试/考试。
每个问题都有一个'问题类型'(' 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)。
感谢您的帮助!
答案 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