【问题标题】:database for random selection随机选择数据库
【发布时间】:2011-10-24 13:17:21
【问题描述】:

我希望能够以一种扩展到 MySQL 中的大表的方式从表中随机选择行。据我所知,这真的是不可能的。有没有其他数据库可以做到这一点?

【问题讨论】:

  • 如果您不从表中删除,则可以使用 mysql(有效地)。所以值得一问 - 您是否期望删除此表的条目?
  • @Jarl:随机选择一行还是多行?
  • 如果你想要一行,这可以很好地适应大表:stackoverflow.com/questions/6541644/…
  • 我需要能够添加和删除内容,现在我只想要一行。

标签: sql database random


【解决方案1】:

是否需要使用 SQL 进行这种类型的选择?如果没有,您可以在代码中生成一个随机数,然后通过生成的数字获取相关记录。当然,这是做一些假设:

  • 要求您的 ID 是身份种子
  • 您的随机数受最小值和最大值的限制。

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT ColumnName 
    FROM TableName
    ORDER BY RAND()
    LIMIT 1;
    

    【讨论】:

    • ORDER BY RAND() 在处理数百万行时确实不能很好地扩展。
    【解决方案3】:

    我认为这是可以做到的...抱歉——这是 TSQL,但是 FWIW

    Declare 
       @max int, 
       @min int, 
       @rand int
    
    set @max = (select max(id) from myTable)
    set @min = (select min(id) from myTable)
    set @rand = Cast(((@max + 1) - @min) * Rand() + @min as int)
    
    select * from myTable where id = @rand
    

    或者,如果您的主键字段有空缺,那么:

    select max(id) from myTable where id <= @rand
    

    根据@andrew 的反对意见——他担心这会在不匹配的比赛中支持较低的 id 数字。如果这是一个问题,您可以通过以下几种方式来处理它:

    一次记录 2 条记录(一个最小值和一个最大值)。例如:

    INSERT INTO whatever_table_variable_etc
    select max(id) from myTable where id <= @rand
    UNION
    select min(id) from myTable where id >= @rand
    

    或者你可以根据赔率和偶数来计算。例如:

    Declare @isOdd bool
    SET @isOdd= CASE WHEN ABS(@rand) % 2 = 1 THEN 1 ELSE 0 END
    
    If @isOdd = 1
       select max(id) from myTable where id <= @rand
    ELSE 
       select min(id) from myTable where id >= @rand
    

    【讨论】:

    • 如果您已从表中删除,这不是很好,因为删除会在 id 中留下空白。间隙意味着您在间隙之前(或之后,具体取决于您如何进行查询)比其他答案更频繁地选择条目(因为实际上每次选择它们或选择缺少的 id 时都会选择它们)。
    • @andrew -- 这只是概念性的。针对您的具体反对意见,通过从最大值到最小值来回切换很容易处理,因此分布将是均匀的。毫无疑问,他想要的不仅仅是一张唱片。
    • @andrew -- 肯定会的。无论如何,如果可以的话,是时候自己提出答案了。
    • 我没有好的解决方案。这是一个众所周知的难题。我只是告诉你,这并不像你想象的那么容易。
    • @andrew -- 毫无疑问,纯粹的随机性问题还没有解决,而且我不认为每个人都会解决。但是对于实际应用程序(即,不仅可以很好地工作,而且可以很好地扩展到大型表的应用程序),我认为你必须忽略极端的边缘情况——没有办法全部捕捉到——或者至少,还没有人能做到。
    猜你喜欢
    • 1970-01-01
    • 2019-12-12
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多