Android MYSQL随机选择候选行,但仅选择一次
我的数据库中有一个表,它有3列:Android MYSQL随机选择候选行,但仅选择一次,android,mysql,sql,select,random,Android,Mysql,Sql,Select,Random,我的数据库中有一个表,它有3列:id,name,category\u id,其中有一百万行。用户在应用程序中选择一个category\u id,然后数据库必须返回具有所选category\u id的12行。然后在下一个api调用中,数据库必须返回具有所选category\u id的接下来12行,依此类推 我的问题是如何随机返回行,并避免在下一个api调用中返回重复的行?您正在寻找可重复的随机排序。为此,您可以使用带有种子的RAND()。其思想是,每个搜索都应该分配一个恒定的种子(例如,您可以在用
id
,name
,category\u id
,其中有一百万行。用户在应用程序中选择一个category\u id
,然后数据库必须返回具有所选category\u id的12行。然后在下一个api调用中,数据库必须返回具有所选category\u id的接下来12行,依此类推
我的问题是如何随机返回行,并避免在下一个api调用中返回重复的行?您正在寻找可重复的随机排序。为此,您可以使用带有种子的
RAND()
。其思想是,每个搜索都应该分配一个恒定的种子(例如,您可以在用户的会话中持久化)
假设用户具有seed12345
,则可以获取其第一页,如下所示:
select * from mytable where category_id = ? order by rand(12345) limit 12
然后按如下方式获取第二页:
select * from mytable where category_id = ? order by rand(12345) limit 12, 12
第三页:
select * from mytable where category_id = ? order by rand(12345) limit 24, 12
依此类推。假设
id
是表的键,并且只有正值,则可以执行以下操作:
select id, name, category_id
from my_table
where category_id = ? and id > ?
order by id
limit 12
第一次调用时,您可以使用:
- 类别id=
123
- id=
-1
id
(假设25
)并使用该id
- 类别id=
123
- id=
25
next
我指的是12个其他
行,它们具有所选的类别id,并且尚未由API返回,我认为此解决方案不起作用。它假设引擎总是以相同的顺序处理/读取行,这不是给定的。@TheImpler:据我所知,这应该可以做到。。参见RAND(3)
给出的示例。否,否。。。我同意RAND()
函数。那很好。问题在于引擎的行检索。它在时间上不稳定。今天它可能检索第1行,然后检索第5行,然后检索第2行,但是明天它可能检索第2行,然后检索第1行,然后检索第5行。@TheImpaler所以具有相同种子的RAND()函数每次返回不同的结果?相反,它每次都返回相同的值。不确定的是这些值将被分配到哪些行。这是一个不错的解决方案,但这些查询中并没有随机性。他们从上到下读取数据库。您可以通过在表中存储一个值(额外的列)或动态执行来添加随机性。您可能需要后者,因为它提供了每个会话/用户的随机性;然而,对于一百万行来说,这将是昂贵的。您的查询将很慢。如果您存储随机值(并偶尔更新一次),查询仍然可能是随机的,但在有利的一面,查询将是瞬时的。这是一个折衷方案,我不知道您是否愿意接受。您的意思是使用随机值作为数据库的游标(id值)?