sql >> Database teknologi >  >> RDS >> Mysql

MYSQL vælg 2 tilfældige rækker fra hver kategori

Bare hent 2 pr. kategori, som du beskrev, og en tilfældig i slutningen. Det er ikke én forespørgsel, men ét resultatsæt, som måske er det, du har brug for:

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 indlejrede Select giver dig mulighed for at sortere efter rand() pr. kategori) Intet særligt indtil videre - 2 tilfældige spørgsmål pr. kategori.

Den vanskelige del nu er at tilføje det 15. element UDDEN vælge nogen af ​​dem, du allerede har.

For at opnå dette med "et" opkald, kan du gøre følgende:

  • Tag den undergruppe af 14 spørgsmål, du har valgt som ovenfor.
  • Forbind dette med et ukategoriseret sæt af tilfældigt sorterede ting fra databasen. (grænse 0,15)
  • Vælg alle fra dette resultat, begræns 0,15.

  • HVIS de første 14 elementer i den SIDSTE underforespørgsel allerede er valgt - vil de blive fjernet på grund af UNION , og et uafhængigt 15. element er garanteret.

  • Hvis den sidste indre forespørgsel også vælger 15 forskellige spørgsmål, vil den ydre grænse på 0,15 kun tage det første af dem med i resultatet.

Noget som:

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

Dette er noget grimt, men burde præcis gøre det, du har brug for:2 tilfældige spørgsmål fra HVER kategori, og endelig et tilfældigt spørgsmål, der IKKE allerede er valgt fra NOGEN kategori. I alt 15 spørgsmål til enhver tid.

(Sidenode:Du kan lige så godt køre en anden forespørgsel ved at bruge NOT IN () at afvise allerede udvalgte spørgsmål efter at have fastlagt de 14 spørgsmål for de 7 kategorier.)

Edit:SQL Fiddle virker desværre ikke i øjeblikket. Her er noget violinkode:

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");

Forespørgsel

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

eksempeldataene indeholder 3 spørgsmål pr. type, hvilket fører til det resultat, at det 15. spørgsmål (sidste række) ALTID er det, der er tilbage fra en kategori.



  1. MySQL datoformat - hvad du behøver at vide

  2. Hvordan kan (eller kan jeg) VÆLGE DISTINCT på flere kolonner?

  3. Oracle SQL henter det n'te element regexp

  4. Forespørgsel for at finde ud af den anden lørdag i hver måned i året