Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MYSQL wählt 2 zufällige Zeilen aus jeder Kategorie aus

Holen Sie einfach 2 pro Kategorie, wie Sie beschrieben haben, und am Ende einen zufälligen. Es ist nicht eine Abfrage, sondern eine Ergebnismenge, die Sie möglicherweise benötigen:

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
...

(Die verschachtelte Auswahl ermöglicht es Ihnen, nach Rand() pro Kategorie zu sortieren.) Bisher nichts Besonderes - 2 zufällige Fragen pro Kategorie.

Der knifflige Teil besteht nun darin, das 15. Element WITHOUT hinzuzufügen Wählen Sie eine von denen aus, die Sie bereits haben.

Um dies mit „einem“ Aufruf zu erreichen, können Sie Folgendes tun:

  • Nehmen Sie die Teilmenge von 14 Fragen, die Sie wie oben ausgewählt haben.
  • Verbinde dies mit einem nicht kategorisierten Satz zufällig sortierter Dinge aus der Datenbank. (Grenze 0,15)
  • Wählen Sie alle aus diesem Ergebnis aus, begrenzen Sie 0,15.

  • WENN die ersten 14 Elemente der LAST-Unterabfrage bereits ausgewählt sind, werden sie aufgrund von UNION entfernt , und ein unabhängiges 15. Element ist garantiert.

  • Wenn die abschließende innere Abfrage ebenfalls 15 verschiedene Fragen auswählt, nimmt die äußere Grenze 0,15 nur die erste davon in das Ergebnis auf.

Etwas wie:

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

Das ist etwas hässlich, sollte aber genau das tun, was Sie brauchen:2 zufällige Fragen aus JEDER Kategorie und schließlich eine zufällige Frage, die noch aus KEINER Kategorie ausgewählt wurde. Insgesamt 15 Fragen zu jeder Zeit.

(Sidenode:Sie könnten genauso gut eine zweite Abfrage ausführen, indem Sie NOT IN () verwenden bereits ausgewählte Fragen abzulehnen, nachdem die 14 Fragen für die 7 Kategorien festgelegt wurden.)

Bearbeiten:Leider funktioniert SQL Fiddle im Moment nicht. Hier ist etwas Geigencode:

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

Abfrage

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

die Beispieldaten enthalten 3 Fragen pro Typ, was dazu führt, dass die 15. Frage (letzte Zeile) IMMER die verbleibende aus einer Kategorie ist.