使用单个sql查询选择多组行

时间:2011-10-24 15:40:48

标签: sql greatest-n-per-group

我有一个问题表,如此......

id |问题|回答|教学大纲|困难

我想创建一个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只来自任何教学大纲的正确数量的问题。

1 个答案:

答案 0 :(得分:1)

这可行,但会非常慢:

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

更好的方法是首先选择5个ID,然后检索与这些ID相对应的行。选择ID本身可以使用WHERE ID>来完成。 RAND(0,MAX(ID)),但如果有间隙,那么您的数据将会出现偏差。

此处讨论了更好的替代方案,但需要更多努力:Simple Random Samples from a Sql database