2015-11-18 4 views
1

У меня есть таблица с именем question_dispositions состоит как этотВыбрать из таблицы ограничения по столбцам другой таблицы

Type | chapter | number 
------------------------- 
A | 1 | 3 
B | 1 | 2 
B | 4 | 1 

Вторая таблица с именем вопрос имеет тип столбцов, текст и главу.

Type | chapter | text 
----------------------- 
A | 1 | T1 
A | 1 | T2 
B | 1 | T3 
B | 1 | T4 
B | 1 | T5 
B | 2 | T6 
B | 2 | T7 
B | 3 | T8 
B | 4 | T9 

Что мне нужно принести X случайные вопросы из таблицы Вопрос, где Х представляет собой столбец номер из question_dispositions

Так что, если мне нужно вопросы типа В, в результате чего я ожидают следующее:

chapter | text 
-------------- 
    1 | T3 
    1 | T4 
    4 | T9 

Как выбрать случайный вопрос, ограничивающий номер столбца в другой таблице? Я пытался с этим запросом, но возвращает каждую строку в таблице Вопрос, как и ожидалось, потому что я не могу ограничить с qd.count

SELECT * FROM 
question_dispositions AS qd, question AS q 
WHERE qd.chapter = q.chapter AND qd.type = q.type AND qd.type = 'B' 
+0

T5 также должен быть там? –

+0

Показать ваш запрос, который вы пробовали? –

+0

@NanaPartykar Нет, потому что мне нужно только 2 вопроса из главы 1. – Luca

ответ

0

ORDER BY RAND() представляет собой типичный подход к хаотичности в MySQL, но это, как правило, критикуют, потому что он плохо масштабируется. Здесь, однако, вы, кажется, выбираете довольно небольшое количество строк в качестве вопросов, но для достижения некоторой случайности. Итак, вот подход, использующий ORDER BY RAND(), который должен быть приемлемым в производительности для небольших наборов результатов.

Существует добавленное требование к LIMIT хранящимся Number, однако в небольшом примере приведенное число не соответствует типу B, поэтому я решил ограничить максимальным количеством этого числа для требуемого типа B. MySQL не 't разрешить использование переменных или подзапросов с предложением LIMIT, поэтому вместо этого сгенерированный номер строки используется в предложении where для достижения этого результата.

Обратитесь к этому SQL Fiddle

данных:

CREATE TABLE question_dispositions 
    (`Type` varchar(1), `chapter` int, `number` int) 
; 

INSERT INTO question_dispositions 
    (`Type`, `chapter`, `number`) 
VALUES 
    ('A', 1, 3), 
    ('B', 1, 2), 
    ('B', 4, 1) 
; 

CREATE TABLE question 
    (`Type` varchar(1), `chapter` int, `text` varchar(2)) 
; 

INSERT INTO question 
    (`Type`, `chapter`, `text`) 
VALUES 
    ('A', 1, 'T1'), 
    ('A', 1, 'T2'), 
    ('B', 1, 'T3'), 
    ('B', 1, 'T4'), 
    ('B', 1, 'T5'), 
    ('B', 2, 'T6'), 
    ('B', 2, 'T7'), 
    ('B', 3, 'T8'), 
    ('B', 4, 'T9') 
; 

Запрос:

SELECT * 
FROM (
    SELECT @rownum := @rownum + 1 AS rn , q.* 
    FROM question_dispositions AS qd 
    INNER JOIN question AS q ON qd.chapter = q.chapter AND qd.type = q.type 
    CROSS JOIN (SELECT @rownum := 0) r 
    WHERE qd.type = 'B' 
    ORDER BY RAND() 
    ) d 
WHERE rn <= (SELECT MAX(NUMBER) FROM question_dispositions WHERE type = 'B') 

Example Results:

| rn | Type | chapter | text | 
|----|------|---------|------| 
| 1 | B |  1 | T3 | 
| 2 | B |  1 | T4 | 
Смежные вопросы