説明したように、カテゴリごとに2つ、最後にランダムに1つフェッチするだけです。これは1つのクエリではなく、1つの結果セットであり、必要なものになる可能性があります。
SELECT * FROM (SELECT * FROM questions WHERE category= 1 ORDER BY rand() limit 0,2) as t1
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 2 ORDER BY rand() limit 0,2) as t2
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 3 ORDER BY rand() limit 0,2) as t3
UNION
...
(ネストされたSelectを使用すると、カテゴリごとにrand()で並べ替えることができます)これまでのところ特別なことはありません-カテゴリごとに2つのランダムな質問。
ここで注意が必要なのは、15番目の要素をなしで追加することです。 あなたがすでに持っているもののいずれかを選択します。
「1回の」呼び出しでこれを実現するには、次のようにします。
- 上記のように選択した14の質問のサブセットを取得します。
- これを、データベースからランダムにソートされたものの分類されていないセットと結合します。 (制限0,15)
-
この結果からすべてを選択し、0,15を制限します。
-
LASTサブクエリの最初の14個の要素がすでに選択されている場合、それらは
UNION
のために削除されます 、および独立した15番目の要素が保証されます。 - 最後の内部クエリで15個の個別の質問も選択された場合、外部制限0,15は、最初の質問のみを結果に取り込みます。
次のようなもの:
SELECT * FROM (
SELECT * FROM (SELECT * FROM questions WHERE category= 1 ORDER BY rand() limit 0,2) as t1
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 2 ORDER BY rand() limit 0,2) as t2
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 3 ORDER BY rand() limit 0,2) as t3
UNION
...
UNION
SELECT * FROM (SELECT * FROM questions ORDER BY rand() LIMIT 0,15) as t8
) AS tx LIMIT 0,15
これはやや醜いですが、必要なことを正確に実行する必要があります。各カテゴリからの2つのランダムな質問と、最後にどのカテゴリからもまだ選択されていないランダムな質問です。いつでも合計15の質問。
(サイドノード:NOT IN ()
を使用して、2番目のクエリを実行することもできます。 7つのカテゴリの14の質問を決定した後、すでに選択されている質問を禁止します。)
編集:残念ながら、SQLFiddleは現在機能していません。ここにいくつかのフィドルコードがあります:
CREATE TABLE questions (id int(10), category int(10), question varchar(20));
INSERT INTO questions (id, category, question)VALUES(1,1,"Q1");
INSERT INTO questions (id, category, question)VALUES(2,1,"Q2");
INSERT INTO questions (id, category, question)VALUES(3,1,"Q3");
INSERT INTO questions (id, category, question)VALUES(4,2,"Q4");
INSERT INTO questions (id, category, question)VALUES(5,2,"Q5");
INSERT INTO questions (id, category, question)VALUES(6,2,"Q6");
INSERT INTO questions (id, category, question)VALUES(7,3,"Q7");
INSERT INTO questions (id, category, question)VALUES(8,3,"Q8");
INSERT INTO questions (id, category, question)VALUES(9,3,"Q9");
INSERT INTO questions (id, category, question)VALUES(10,4,"Q10");
INSERT INTO questions (id, category, question)VALUES(11,4,"Q11");
INSERT INTO questions (id, category, question)VALUES(12,4,"Q12");
INSERT INTO questions (id, category, question)VALUES(13,5,"Q13");
INSERT INTO questions (id, category, question)VALUES(14,5,"Q14");
INSERT INTO questions (id, category, question)VALUES(15,5,"Q15");
INSERT INTO questions (id, category, question)VALUES(16,6,"Q16");
INSERT INTO questions (id, category, question)VALUES(17,6,"Q17");
INSERT INTO questions (id, category, question)VALUES(18,6,"Q18");
INSERT INTO questions (id, category, question)VALUES(19,7,"Q19");
INSERT INTO questions (id, category, question)VALUES(20,7,"Q20");
INSERT INTO questions (id, category, question)VALUES(21,7,"Q21");
クエリ
SELECT * FROM (
SELECT * FROM (SELECT * FROM questions WHERE category= 1 ORDER BY rand() limit 0,2) as t1
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 2 ORDER BY rand() limit 0,2) as t2
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 3 ORDER BY rand() limit 0,2) as t3
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 4 ORDER BY rand() limit 0,2) as t4
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 5 ORDER BY rand() limit 0,2) as t5
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 6 ORDER BY rand() limit 0,2) as t6
UNION
SELECT * FROM (SELECT * FROM questions WHERE category= 7 ORDER BY rand() limit 0,2) as t7
UNION
SELECT * FROM (SELECT * FROM questions ORDER BY rand() LIMIT 0,15) as t8
) AS tx LIMIT 0,15
サンプルデータには、タイプごとに3つの質問が含まれているため、15番目の質問(最後の行)は常にカテゴリから残っている質問になります。