Просто вземете 2 за категория, както сте описали, и едно произволно накрая. Това не е една заявка, а един набор от резултати, който може да е това, от което се нуждаете:
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-ия елемент БЕЗ като изберете някоя от тези, които вече имате.
За да постигнете това с "едно" повикване, можете да направите следното:
- Вземете подгрупата от 14 въпроса, които сте избрали, както по-горе.
- Обединете това с некатегоризиран набор от произволно сортирани неща от базата данни. (ограничение 0,15)
-
Изберете всички от този резултат, ограничение 0,15.
-
АКО първите 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 въпроса по всяко време.
(Sidenode:Можете също така да изпълните втора заявка, като използвате NOT IN ()
за отхвърляне на вече избрани въпроси след определяне на 14-те въпроса за 7-те категории.)
Редактиране:За съжаление SQL Fiddle не работи в момента. Ето малко код за цигулка:
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-ият въпрос (последния ред) ВИНАГИ е този, който остава от категория.