sql >> Databasteknik >  >> RDS >> Mysql

MYSQL väljer 2 slumpmässiga rader från varje kategori

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.



  1. Bitwise Flags övergivna?

  2. Hur man sammanfogar resultat av 2 tabeller baserat på icke-villkor

  3. MySQL - räkna ut AVG för en delmängd av MAX-värden

  4. En databasmodell för en onlineundersökning. Del 2