从另一个表的列限制中选择

时间:2015-11-18 10:06:55

标签: mysql select limit

我有一个名为 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'

1 个答案:

答案 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 |