Mysql
 sql >> база данни >  >> RDS >> Mysql

MYSQL избира 2 произволни реда от всяка категория

Просто вземете 2 за категория, както сте описали, и едно произволно накрая. Това не е една заявка, а един набор от резултати, който може да е това, от което се нуждаете:

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 ви позволява да сортирате по rand() за категория) Нищо особено досега - 2 произволни въпроса за категория.

Сложната част сега е да добавите 15-ия елемент БЕЗ като изберете някоя от тези, които вече имате.

За да постигнете това с "едно" повикване, можете да направите следното:

  • Вземете подгрупата от 14 въпроса, които сте избрали, както по-горе.
  • Обединете това с некатегоризиран набор от произволно сортирани неща от базата данни. (ограничение 0,15)
  • Изберете всички от този резултат, ограничение 0,15.

  • АКО първите 14 елемента от ПОСЛЕДНАТА подзаявка вече са избрани - те ще бъдат премахнати поради UNION , и е гарантиран независим 15-ти елемент.

  • Ако последната вътрешна заявка избере и 15 отделни въпроса, външната граница 0,15 ще вземе само първия от тях в резултата.

Нещо като:

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

Това е малко грозно, но трябва да прави точно това, от което се нуждаете:2 произволни въпроса от ВСЯКА категория и накрая произволен въпрос, който НЕ е избран вече от НИТО ЕДНА категория. Общо 15 въпроса по всяко време.

(Sidenode:Можете също така да изпълните втора заявка, като използвате NOT IN () за отхвърляне на вече избрани въпроси след определяне на 14-те въпроса за 7-те категории.)

Редактиране:За съжаление SQL Fiddle не работи в момента. Ето малко код за цигулка:

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

Заявка

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

примерните данни съдържат 3 въпроса за тип, което води до резултата, че 15-ият въпрос (последния ред) ВИНАГИ е този, който остава от категория.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на SSIS за заявка на ADO .NET изходна заявка, преминаваща в параметри от SQL Server

  2. Редът на именувани параметри има смисъл за MySql .Net доставчик на данни?

  3. Външен ключ за множество таблици и колони?

  4. PHP формулярът връща Забележка:Преобразуване на масив в низ

  5. TIME_TO_SEC() Примери – MySQL