我有一个名为 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随机问题,其中X是来自 question_dispositions
的列数字因此,如果我需要B类问题,我期望的结果就是:
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 :(得分:0)
ORDER BY RAND()是MySQL中典型的随机性方法,但它通常受到批评,因为它不能很好地扩展。然而,在这里你似乎选择了很少的行作为问题,但实现了一些随机性。因此,这是一种使用ORDER BY RAND()的方法,对于小型结果集,这种方法应该是可接受的。
存储的Number
对LIMIT有一个额外的要求,但是在提供的小例子中,这个数字对于类型B不一致,所以我选择限制所需类型B的最大数量MySQL不允许在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 |