Выбор нескольких наборов строк с помощью одного запроса sql

У меня есть таблица вопросов, изложенная так..

идентификатор | вопрос | ответ | программа | трудность

Я хочу создать оператор SQL, который случайным образом выбирает 5 вопросов для каждой из отдельных программ, когда сложность невелика.

Итак, если есть 4 программы, у меня будет 20 вопросов.

Я думал о чем-то подобном...

   SELECT 
    * 
FROM 
    questions 
WHERE 
    difficulty='easy' 
AND 
    syllabus 
IN 
(
    SELECT DISTINCT 
        syllabus 
    FROM 
        questions 
    WHERE 
        difficulty='easy'
) 
LIMIT 
(5*
    (
    SELECT 
        COUNT(DISTINCT syllabus) 
    FROM 
        questions 
    WHERE 
        difficulty='easy'
    )

Но это не возвращает 5 из каждой из отдельных программ, а только правильное количество вопросов из любой программы.


person TrueWheel    schedule 24.10.2011    source источник
comment
Добавлен тег [величайший-n-на-группу]. См. аналогичный вопрос под заголовком Связанные справа.   -  person ypercubeᵀᴹ    schedule 24.10.2011
comment
была бы лучшей моделью данных, если бы у вас была отдельная таблица с учебным планом   -  person Trevor North    schedule 24.10.2011
comment
есть ли у вас какие-либо идентификаторы для вопросов/учебной программы и является ли учебная программа столбцом идентификаторов?   -  person r0ast3d    schedule 24.10.2011
comment
И я дам вам +1 только за то, что вы попробовали LIMIT 5*(SELECT COUNT(*) ...) утверждение.   -  person ypercubeᵀᴹ    schedule 24.10.2011
comment
Спасибо за вашу помощь. В настоящее время учебный план представляет собой просто текстовое поле с названием учебного плана, но я изменю его на идентификатор учебного плана и создам отдельную таблицу учебных планов. Однако у меня все еще та же проблема.   -  person TrueWheel    schedule 24.10.2011


Ответы (1)


Это сработает, но будет очень медленно:

SELECT * FROM questions WHERE difficulty='easy' ORDER BY RAND() LIMIT 5;

Лучше сначала выбрать 5 идентификаторов, а затем получить строки, соответствующие этим идентификаторам. Выбор самих идентификаторов можно выполнить с помощью WHERE ID > RAND (0, MAX (ID)), но если есть пробелы, ваши данные будут искажены.

Здесь обсуждается лучшая альтернатива, но она требует больше усилий: база данных

person Konerak    schedule 24.10.2011