我正在构建一个测验游戏应用,我想改进一些查询。
当我启动游戏时,我必须从数据库中检索一些随机问题
现在,当游戏启动时,它有一个给定的类别,以及要检索的给定数量的数据。数据库中的问题曾经有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子类别的数量随着类别而变化。
我一直在使用多个查询,但我没有找到任何方法在单个查询中执行该操作。
有人会对此有所了解吗? :)
答案 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中绑定,你会成为一个更好的过滤网站。