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;
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()
其中:大小是您要显示的每个子类别的问题数。
我正在构建问答游戏应用,我想改进一些查询。
当我启动游戏时,我必须从数据库中检索一些随机问题。
现在,当游戏启动时,它有一个给定的类别,以及要检索的给定数量的数据。数据库中的问题曾经有一个 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;
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()
其中:大小是您要显示的每个子类别的问题数。