sql >> Databáze >  >> RDS >> Mysql

MYSQL vybere 2 náhodné řádky z každé kategorie

Stačí načíst 2 na kategorii, jak jste popsali, a jednu náhodně na konci. Není to jeden dotaz, ale jedna sada výsledků, což může být to, co potřebujete:

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

(Vnořený výběr vám umožňuje třídit podle rand() na kategorii)Zatím nic zvláštního - 2 náhodné otázky na kategorii.

Složitější částí je nyní přidání 15. prvku WITHOUT výběrem některého z těch, které již máte.

Chcete-li toho dosáhnout pomocí „jednoho“ volání, můžete provést následující:

  • Vezměte si podmnožinu 14 otázek, které jste vybrali výše.
  • Spojte to s nekategorizovanou sadou náhodně seřazených věcí z databáze. (limit 0,15)
  • Vybrat vše z tohoto výsledku, limit 0,15.

  • POKUD je již vybráno prvních 14 prvků POSLEDNÍHO poddotazu – budou odstraněny z důvodu UNION a nezávislý 15. prvek je zaručen.

  • Pokud poslední vnitřní dotaz vybere také 15 různých otázek, vnější limit 0,15 vezme do výsledku pouze první z nich.

Něco jako:

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

To je poněkud ošklivé, ale mělo by to dělat přesně to, co potřebujete:2 náhodné otázky z KAŽDÉ kategorie a nakonec náhodná otázka, která již NEBYLA vybrána z ŽÁDNÉ kategorie. Celkem 15 otázek kdykoli.

(Sidenode:Můžete také spustit druhý dotaz pomocí NOT IN () zrušit již vybrané otázky po určení 14 otázek pro 7 kategorií.)

Edit:Bohužel SQL Fiddle momentálně nefunguje. Zde je nějaký kód houslí:

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

Dotaz

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

ukázková data obsahují 3 otázky na typ, což vede k výsledku, že 15. otázka (poslední řádek) je VŽDY ta zbývající z kategorie.



  1. Problém RAISERROR od migrace na SQL Server 2012

  2. Existuje způsob, jak omezit výsledek pomocí ELOQUENT ORM od Laravel?

  3. T-SQL Přeskočit Převzít uloženou proceduru

  4. psycopg2 :kurzor je již uzavřen