sql >> Database >  >> RDS >> Mysql

MYSQL selecteer 2 willekeurige rijen uit elke categorie

Haal er gewoon 2 per categorie zoals je hebt beschreven, en één willekeurig aan het einde. Het is niet één zoekopdracht, maar één resultaatset, en dat is misschien wat u nodig heeft:

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

(Met de geneste Select kun je sorteren op rand() per categorie) Niets bijzonders tot nu toe - 2 willekeurige vragen per categorie.

Het lastige is nu om het 15e element ZONDER . toe te voegen het selecteren van een van degenen die je al hebt.

Om dit te bereiken met "één" oproep, kunt u het volgende doen:

  • Neem de subset van 14 vragen die je hierboven hebt geselecteerd.
  • Verenig dit met een ongecategoriseerde set van willekeurig gesorteerde dingen uit de database. (limiet 0,15)
  • Selecteer alles uit dit resultaat, limiet 0,15.

  • ALS de eerste 14 elementen van de LAATSTE subquery al zijn geselecteerd, worden ze verwijderd vanwege UNION , en een onafhankelijk 15e element is gegarandeerd.

  • Als de laatste binnenvraag ook 15 verschillende vragen selecteert, neemt de buitenste limiet 0,15 alleen de eerste op in het resultaat.

Iets als:

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

Dit is een beetje lelijk, maar zou precies moeten doen wat je nodig hebt:2 willekeurige vragen uit ELKE categorie, en tot slot een willekeurige vraag die nog NIET uit ENIGE categorie is geselecteerd. Een totaal van 15 vragen op elk moment.

(Sidenode:je kunt net zo goed een tweede query uitvoeren met NOT IN () om reeds geselecteerde vragen te weigeren na het bepalen van de 14 vragen voor de 7 categorieën.)

Bewerken:Helaas werkt SQL Fiddle momenteel niet. Hier is wat vioolcode:

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

Zoekopdracht

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

de voorbeeldgegevens bevatten 3 vragen per type, wat leidt tot het resultaat dat de 15e vraag (laatste rij) ALTIJD degene is die over is van een categorie.



  1. MYSQL Query &PHP - Query geeft nul terug aan IOS App

  2. Database-ontwerp, items in categorie, subcategorie en thema

  3. Gids voor gegevensanalyse:het is tijd om uit te blinken met Excel!

  4. Bij verwijderen cascade voor zelfverwijzende tabel