sql mysql查询根据条件随机获取定义的行数

时间:2013-01-30 19:37:11

标签: php mysql sql random

我正在开发一个在线考试应用程序,其中我有一个问题主表,其中包含一个字段(名称:qtype),其中包含问题类型的数据。问题类型可以是以下三种类型之一:

  1. 多个
  2. 递减
  3. 应用程序使用以下查询从此主表生成随机问题文件:

    select * from mst_question where test_id = 1 ORDER BY RAND() LIMIT 25
    

    这为我的在线考试申请生成了25个问题的随机问卷。

    到目前为止它的工作良好......

    现在,我需要在我的应用程序中实现一个功能,其中25个随机生成的问题(或任何数字 - 这取决于测试ID)将始终具有主问题中可用的不同类型问题的FIXED组合每个随机生成的问卷集的表(mst_question)。

    假设,如果主问题表针对特定测试ID有108个问题,并且所有这三种类型的问题都在该测试的数据库中,则它将为每个随机查询提供相同数量的不同类型问题!我编写了以下sql查询,以找出主问题表中每种问题的百分比。

    到目前为止,我已经尝试了这个并提出了这个SQL查询:

    select qtype,count(*) as qtypetotal,(select count(*) from mst_question where test_id = 1) as totalqtype,round((count(*)/(select count(*) from mst_question where test_id = 1)*100),2) as qtypepercentage from mst_question where test_id = 1 group by qtype
    

    以上查询的输出为:

    qtype       qtypetotal  totalqtype  qtypepercentage  
    desc        24      108     22.22 %  
    multiple    34      108     31.48 %  
    single      50      108     46.30 %  
    

    我需要形成一个sql查询,它会给我25个随机生成的问题,25个问题中22.22%应该是desc类型,25个问题中31.48%应该是多个类型,25个问题中剩下的46.30%应该是单一类型。

    我被困了.......请指教......

    提前致谢: - )

    谢谢@MikeBrant ....我已经生成了动态sql,这绝对是我想要的方式......现在只有一个问题....如果我执行这个SQL查询:

    select qtype,round(25*(count(*)/(select count(*) from mst_question where test_id = 1))) as numquests from mst_question where test_id = 1 group by qtype
    

    我得到以下结果:

    “desc”“6” “多个”“8” “单身”“12”

    并基于上述查询生成此动态查询:

    $dynamicsql[] =  "(SELECT * FROM mst_question WHERE test_id = 1 AND qtype = '".trim($rstype->qtype)."' ORDER BY RAND() LIMIT ".$rstype->numquests.")";
    
    $finalsql = implode(" UNION ALL ",$dynamicsql)." ORDER BY RAND()";
    

    我想生成总共25个随机问题,但这些qtypes的总和是26!我得到一个额外的问题: - (

1 个答案:

答案 0 :(得分:4)

我可能只是在这里使用UNION:

    (SELECT * FROM mst_question
    WHERE test_id = 1 AND qtype = 'desc'
    ORDER BY RAND() LIMIT X)
UNION ALL
    (SELECT * FROM mst_question
    WHERE test_id = 1 AND qtype = 'multiple'
    ORDER BY RAND() LIMIT Y)
UNION ALL
    (SELECT * FROM mst_question
    WHERE test_id = 1 AND qtype = 'single'
    ORDER BY RAND() LIMIT Z)
ORDER BY RAND()

您可以使用您在原始问题上提出的查询来获取要使用的X,Y和Z的值。