【问题标题】:mysql select not repeated random numbers from database [closed]mysql从数据库中选择不重复的随机数[关闭]
【发布时间】:2020-12-09 12:16:43
【问题描述】:

我只是想知道我是否可以做到。 感谢您提前帮助我。

我的数据库中有 100000 个 ID。 我想从 100000 个中随机选择 10 个。 如果我转到下一页,我还会从数据库中随机选择 10 个 id(与以前的 id 不重复) 最后我选择了所有 100000 个 id。

如果我刷新我的页面,它会从头开始。

我有一个想法,用种子选择随机数 1000 次并将其存储在 redis 上,并在用户进入页面时每 10 行弹出一次。有什么不同的想法吗?

我一次需要 10 个随机 ID。每次我要求一个新集合时,我都需要获得一组新的随机 id,但是新的不能包括我从之前要求新集合的任何次数中已经得到的任何一个,除非这个过程是重置。我的数据库中可能总共有 100 或 100 万个 ID。我计划使用 id 在网页上显示 10 个项目,并带有下一个和上一个按钮。如果用户返回任何之前显示的页面,已经显示的页面必须与显示的原始项目一致

来自@Scratte 感谢您澄清我想说的话!

如果不可能,那也没关系。谢谢。

【问题讨论】:

  • SELECT xx FROM posts ORDER BY RAND() LIMIT ?*10, 10 之类的有什么问题?即这适用于大桌子。您关心哪些性能特征?
  • @SamMason 每次按下下一页按钮时,我都必须从数据库中获取它。如果我转到下一页,那么我可能会得到与上一页相同的数字。我错了吗?例如,第一个:10,20,30,40,50,60,70 第二个:10,23,35,49,95,63,7,8,9,10(重复)...(总数应该是1到100)
  • 请看我的回答好吗? @SamMason 我认为您可以使用 js 来解决这个问题,而不仅仅是 MySQL。
  • @SamMason 如果您对我的评论感到难过,我的评论并没有冒犯。我真的很感谢你的帮助。非常感谢你帮助我
  • 这个问题需要详细说明是什么让你不确定它是否可能。你读过任何不可能的地方吗?你尝试过失败了吗?您究竟是如何尝试的,又是如何失败的?您明确声明您只想知道它是否可能。但坦率地说,我对此表示怀疑。如果有人回答“是”。你不会满足的。因此,一个好的答案将提供一个演示,但这对于基本上说“我想要”的问题是不合适的。没有任何研究或努力的证明。

标签: mysql select random


【解决方案1】:

我只是在这里添加一个想法。您需要将其转换为代码。


您首先从数据库中批量获取行,而不是10 的切片。这是为了通过减少数据库往返来提高性能。

从 DB 中获取 1000 行并将它们存储在 session 中。

查询:

Select *
from table
where id NOT IN (previous_ids)
order by rand()
limit 0,1000 

注意:由于 ID 是索引列,NOT IN 应该更快。

现在,您有 1000 行,将它们全部存储在会话中。当用户请求的页面是 1000 的倍数时,只有在您才会向数据库发起另一个查询。这为您提供了摊销的性能。见下文:

page_request = 1
if (page_request - 1) % 1000 == 0:
   fire DB to get next 1000 rows
   $_SESSION['data'][intval(page_request / 1000)] = fetched_rows

当用户请求页面时,你会得到如下数据:

key = intval(page_request / 1000)
record_offset = (page_request % 1000 - 1) * 10
return array_splice($_SESSION['data'][key],record_offset,10)

如果用户完全刷新了页面,你可以像shuffle($_SESSION['data'][key])一样做一个shuffle来随机重新排列元素,然后返回到前端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多