Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否从每个类别中至少选择一个?_Android_Database_Sqlite_Random - Fatal编程技术网

Android 是否从每个类别中至少选择一个?

Android 是否从每个类别中至少选择一个?,android,database,sqlite,random,Android,Database,Sqlite,Random,我有一个SQLite数据库,里面有一堆测试/考试问题。每个问题属于一个问题类别 我的桌子看起来像这样: 目标 我试图做的是选择5个随机问题,但结果必须包含每个类别中至少一个。目标是从每个类别中随机选择一组问题 例如,输出可以是问题ID1、2、5、7、8,或2、3、6、7、8或8、6、3、1、7 按类别排序\u id,随机() 通过执行下面的SQL,我可以从SQLite获得一个随机的问题列表,但是如何确保结果包含来自我的每个类别的问题呢 基本上,我正在寻找类似SQLite的版本 我只想得到5个

我有一个SQLite数据库,里面有一堆测试/考试问题。每个问题属于一个问题类别

我的桌子看起来像这样:

目标
我试图做的是选择5个随机问题,但结果必须包含每个类别中至少一个。目标是从每个类别中随机选择一组问题

例如,输出可以是问题ID
1、2、5、7、8
,或
2、3、6、7、8
8、6、3、1、7

按类别排序\u id,随机() 通过执行下面的SQL,我可以从SQLite获得一个随机的问题列表,但是如何确保结果包含来自我的每个类别的问题呢

基本上,我正在寻找类似SQLite的版本

我只想得到5个结果,但每个类别都有一个(或多个),所有类别都在结果集中

赏金
添加了一个赏金,因为我很好奇是否可以只在SQLite中实现这一点。我可以在SQLite+Java中实现这一点,但有没有办法只在SQLite中实现这一点呢?:)


基本上,您要查找的是选择top N max Value。我每天早上花3-4个小时来搜索它。(我仍然没有成功,你可能需要再等几个小时)

对于临时解决方案,您可以使用以下分组方式选项

String strQuery=“按类别从so_问题组中选择*”

输出如下:

将返回您的确切需求。

因为它是sqlite(因此是本地的):在您有5个答案和4个不同的类别之前,只进行查询会有多慢,每次迭代都会删除重复的类别行

我认为,如果每个类别都有相同的代表性,那么您需要的迭代次数不太可能超过3次,而且还不到一秒钟


这在算法上不好,但对我来说,在SQL语句中使用random()在算法上也不好。

答案的关键在于结果中有两种问题:对于每个类别,一个问题必须限制来自该类别;还有一些剩余的问题

首先,受限问题:我们只需从每个类别中选择一条记录:

选择id,类别id,问题文本,1作为约束,max(random())作为r
从苏族问题
按类别分组\u id
(此查询依赖于SQLite 3.7.11(在Jelly Bean或更高版本中)中引入的一个功能:
SELECT a,max(b)
,保证
a
的值来自具有最大
b
值的记录。)

我们还必须获得非约束问题(过滤出约束集中已经存在的重复项将在下一步中发生):

SELECT id,category\u id,question\u text,0作为约束,random()作为r
从苏族问题
当我们将这两个查询与
UNION
组合,然后按
id
分组时,我们将所有重复项放在一起。选择
max(constrated)
可确保对于具有重复项的组,仅保留受约束的问题(而所有其他问题在每个组中仅保留一条记录)

最后,
ORDER BY
子句确保约束问题排在第一位,然后是一些随机的其他问题:

SELECT*,最大值(受约束)
FROM(选择id,类别id,问题文本,1作为约束,max(random())作为r
从苏族问题
按类别分组\u id
联合所有
选择id、类别id、问题文本、0作为约束、随机()作为r
来自so_的问题)
按id分组
按约束描述排序,r
限制5

对于早期的SQLite/Android版本,我没有找到不使用临时表的解决方案(因为约束问题的子查询必须使用多次,但由于
random()
)而不能保持不变):

开始交易;
创建受约束为的临时表
选择(选择id)
从苏族问题
其中category\u id=cats.category\u id
随机排序
限制1)作为id
从(选择不同的类别\u id
从sou问题)到猫;
选择id.id、类别id、问题文本
从(选择id)
从(选择id,1作为c
来自约束
联合所有
选择id,0作为c
从苏族问题
其中id不在(从约束中选择id))
按c描述排序,随机()
限制(5)作为ID
在id.id=so_questions.id上加入so_问题;
下拉表约束;
提交事务;

从问题限制0,5中选择不同的(类别\u id)您是否尝试过此方法?这样可以获得唯一的类别列表,但我想要的不是那么容易:(.题外话:yeey,多亏了我们的stackoverflow小部件,我发现了一个同事的问题!但是当我只选择5个问题时,我仍然无法从每个类别中获得一个问题。它只从结果集中选择前5行。(在本例中,id为1,2,3,4,5的行)@TerrySeidler,不,输出将只有4行,因为只有1,2,3,4个不同的类别,但OP需要随机5行,每个类别必须至少包含一行…@Sam,这意味着任何一个类别都会重复,因为总共只有4个类别,对吧?是的。但哪一个类别重复并不重要。观察得好n!这似乎是得到我想要的东西的最佳方法。当我昨天提出这个问题时,我仍然希望有一个纯SQL的解决方案,但这是一个有效的替代方案。今晚我将看一看如何实现:)。很好,这很有效!谢谢你的解释。我已经完成了t