SQL - 选择每个IN参数

时间:2015-05-06 17:06:51

标签: mysql sql subquery

我正在构建一个测验游戏应用,我想改进一些查询。

当我启动游戏时,我必须从数据库中检索一些随机问题 现在,当游戏启动时,它有一个给定的类别,以及要检索的给定数量的数据。数据库中的问题曾经有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个问题( the子类别的数量随着类别而变化。

我一直在使用多个查询,但我没有找到任何方法在单个查询中执行该操作。

有人会对此有所了解吗? :)

2 个答案:

答案 0 :(得分:2)

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

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()

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

答案 1 :(得分:0)

您可以使用用户变量执行此操作,例如:

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。通过使用category-&gt;子类别关系而不是在subcategory_ids中绑定,你会成为一个更好的过滤网站。