Hämta bara 2 per kategori som du beskrev, och en slumpmässig i slutet. Det är inte en fråga, utan en resultatuppsättning, som kan vara vad du behöver:
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
...
(Det kapslade Select låter dig sortera efter rand() per kategori) Inget speciellt än så länge - 2 slumpmässiga frågor per kategori.
Det knepiga nu är att lägga till det 15:e elementet UTAN välja någon av dem du redan har.
För att uppnå detta med "ett" samtal kan du göra följande:
- Ta delmängden av 14 frågor som du har valt enligt ovan.
- Förena detta med en okategoriserad uppsättning slumpvis sorterade saker från databasen. (gräns 0,15)
-
Välj alla från detta resultat, gräns 0,15.
-
OM de första 14 elementen i den SISTA underfrågan redan är markerade - kommer de att tas bort på grund av
UNION
, och ett oberoende 15:e element garanteras. - Om den sista inre frågan också väljer 15 distinkta frågor, kommer den yttre gränsen 0,15 bara att ta med den första av dem i resultatet.
Något i stil med:
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
Det här är lite fult, men bör göra precis vad du behöver:2 slumpmässiga frågor från VARJE kategori, och slutligen en slumpmässig fråga som INTE redan har valts ur NÅGON kategori. Totalt 15 frågor när som helst.
(Sidenode:Du kan lika gärna köra en andra fråga med NOT IN ()
att neka redan valda frågor efter att ha bestämt de 14 frågorna för de 7 kategorierna.)
Edit:Tyvärr fungerar inte SQL Fiddle för tillfället. Här är lite spelkod:
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");
Fråga
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
exempeldatan innehåller 3 frågor per typ, vilket leder till att den 15:e frågan (sista raden) ALLTID är den som återstår från en kategori.