【问题标题】:sql mysql query for fetching a defined numbers of rows randomly based on condition用于根据条件随机获取定义数量的行的 sql mysql 查询
【发布时间】:2013-01-14 18:05:50
【问题描述】:

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

  1. 单人
  2. 多个
  3. 描述

应用程序正在使用以下查询从此主表生成随机试卷:

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

这会为我的在线考试申请生成一份包含 25 个问题的随机问卷。

到目前为止,它工作得很好......

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

假设,如果主问题表有 108 个特定测试 ID 的问题,并且所有三种类型的问题都在该测试的数据库中,它将为每个随机查询提供相同数量的不同类型问题!我写了下面的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 总计qtype qtypepercentage 降 24 108 22.22 % 倍数 34 108 31.48 % 单人 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

我得到以下结果:

“描述”“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 !!!我还有一个额外的问题:-(

【问题讨论】:

  • 试着这样想 - 每个测试你需要 24 个desc 类型的随机问题...

标签: php mysql sql random


【解决方案1】:

我可能会在这里使用 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 的值。

【讨论】:

  • 错误代码:1221 UNION 和 ORDER BY 使用不正确(耗时 0 毫秒)
  • @Sandy505 啊,是的。我真傻。实际上需要使用子选择来实现这一点。查看更新的答案。
  • @sgeddes 我并不打算将它们作为实际变量,而是将由先前查询确定的值的占位符确定问题的适当组合。
  • @MikeBrant:您不需要所有的嵌套表。可以简化。
  • @ypercube 会对您建议如何执行此操作感兴趣。此处的目的是获取 X-Y-Z 数量的随机问题,然后随机化问题的整体顺序。
猜你喜欢
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多