3

質問のタイプのデータを含むフィールド(名前:qtype)を含む質問マスターテーブルがあるオンライン試験アプリケーションを開発しています。質問の種類は、次の3つの種類のいずれかになります。

  1. 独身
  2. 多数
  3. 説明

アプリケーションは、次のクエリを使用して、このマスターテーブルからランダムな質問用紙を生成しています。

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

これにより、オンライン試験アプリケーションの25の質問のランダムなアンケートが生成されます。

これまでのところ、うまく機能しています...

ここで、アプリケーションに機能を実装する必要があります。この機能では、ランダムに生成された25の質問(または任意の数-これはテストIDによって異なります)に、マスター質問テーブル(mst_question)で使用可能なさまざまなタイプの質問の修正された組み合わせが常に含まれます。 )ランダムに生成されたすべての質問票セットに対して。

たとえば、マスター質問テーブルに特定のテストIDに対して108の質問があり、3つのタイプの質問すべてがこのテストのデータベースにある場合、ランダムクエリごとに同じ数の異なるタイプの質問が提供されます。マスター質問テーブル内の各タイプの質問の割合を調べるために、次の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  
説明2410822.22%  
複数3410831.48%  
シングル5010846.30%  

ランダムに生成された25の質問を生成するSQLクエリを作成する必要があります。ここで、25の質問の22.22%はdescタイプ、31.48%の25の質問は複数のタイプ、残りの46.30%の25の質問は単一タイプである必要があります。

私は立ち往生しています.......plsはアドバイスします...

前もって感謝します :-)

ありがとう@MikeBrant....私は間違いなく私が望んでいた方法である動的SQLを生成しました...今1つの問題だけ....私がこの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" "multiple" "8" "single" "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のランダムな質問を生成したいのですが、これらのqtypeの合計は26です!!! そして私は余分な質問を受けています:-(

4

1 に答える 1

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の値を取得できます。

于 2013-01-30T19:42:29.100 に答える