SQL - Select 每个 IN 参数的结果数量相等

SQL - Select equal numbers of result of each IN parameter

我正在构建问答游戏应用,我想改进一些查询。

当我启动游戏时,我必须从数据库中检索一些随机问题。
现在,当游戏启动时,它有一个给定的类别,以及要检索的给定数量的数据。数据库中的问题曾经有一个 category_id 属性。

SELECT id 
FROM game_data
WHERE category_id = :category_id
ORDER BY rand()
LIMIT :size

但在数据库中进行了一些更改后,问题现在有一个 subcategory_id 属于一个类别。所以现在查询看起来像这样:

SELECT id 
FROM game_data
WHERE subcategory_id IN (:subcategory_id1, :subcategory_id2...)
ORDER BY rand()
LIMIT :size

现在我的问题如下:

我想在我的查询中为每个子类别检索相同数量的问题。
例如,如果我有 18 个问题要检索和 6 个不同的子类别,我必须为每个子类别检索 3 个问题(子类别的数量随类别而变化).

我一直在用多个查询来做这件事,但我还没有找到任何在单个查询中执行它的方法。

有人知道吗? :)

您可以使用用户变量来完成,例如:

SELECT id 
  FROM (
   SELECT id,
          CASE 
            WHEN @sub_cat = subcategory_id THEN @count := @count + 1
            ELSE @count := 0
          END count,
          @sub_cat := subcategory_id sub_cat          
     FROM (
       SELECT *, rand() rand
         FROM game_data
        WHERE subcategory_id IN (:subcategory_id1, :subcategory_id2...)
     ORDER BY subcategory_id, rand
          ) rand
     JOIN (SELECT @sub_cat := NULL, @count := 0) init
       ) pick
 WHERE count < :qu_per_group; 

SQLFiddle

N.B. 如果使用类别-> 子类别关系而不是绑定到 subcategory_ids 中进行过滤,你会成为一个该死的网站。

使用联合方法,您可以使用类似的东西(此处针对两个类别显示)

SELECT * FROM (

SELECT id 
FROM game_data
WHERE category_id = :category_id1
LIMIT :size

UNION ALL

SELECT id 
FROM game_data
WHERE category_id = :category_id2
LIMIT :size
) q1

ORDER BY rand()

其中:大小是您要显示的每个子类别的问题数。