Android MYSQL随机选择候选行,但仅选择一次

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()。其思想是,每个搜索都应该分配一个恒定的种子(例如,您可以在用

我的数据库中有一个表,它有3列:
id
name
category\u id
,其中有一百万行。用户在应用程序中选择一个
category\u id
,然后数据库必须返回具有所选category\u id的12行。然后在下一个api调用中,数据库必须返回具有所选category\u id的接下来12行,依此类推


我的问题是如何随机返回行,并避免在下一个api调用中返回重复的行

您正在寻找可重复的随机排序。为此,您可以使用带有种子的
RAND()
。其思想是,每个搜索都应该分配一个恒定的种子(例如,您可以在用户的会话中持久化)

假设用户具有seed
12345
,则可以获取其第一页,如下所示:

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
第二次从之前获得max
id
(假设
25
)并使用该id

  • 类别id=
    123
  • id=
    25

你所说的“…接下来的12行”是什么意思?我认为您在这里有一个基本的误解:表行没有固有的行顺序。您需要更具体一些。@implaer by
next
我指的是12个
其他
行,它们具有所选的
类别id,并且尚未由API返回,我认为此解决方案不起作用。它假设引擎总是以相同的顺序处理/读取行,这不是给定的。@TheImpler:据我所知,这应该可以做到。。参见
RAND(3)
给出的示例。否,否。。。我同意
RAND()
函数。那很好。问题在于引擎的行检索。它在时间上不稳定。今天它可能检索第1行,然后检索第5行,然后检索第2行,但是明天它可能检索第2行,然后检索第1行,然后检索第5行。@TheImpaler所以具有相同种子的RAND()函数每次返回不同的结果?相反,它每次都返回相同的值。不确定的是这些值将被分配到哪些行。这是一个不错的解决方案,但这些查询中并没有随机性。他们从上到下读取数据库。您可以通过在表中存储一个值(额外的列)或动态执行来添加随机性。您可能需要后者,因为它提供了每个会话/用户的随机性;然而,对于一百万行来说,这将是昂贵的。您的查询将很慢。如果您存储随机值(并偶尔更新一次),查询仍然可能是随机的,但在有利的一面,查询将是瞬时的。这是一个折衷方案,我不知道您是否愿意接受。您的意思是使用随机值作为数据库的游标(id值)?