【问题标题】:Return rows in random order [duplicate]以随机顺序返回行[重复]
【发布时间】:2010-11-10 04:56:29
【问题描述】:

是否可以编写每次查询运行时以随机顺序返回表行的 SQL 查询?

【问题讨论】:

  • 我投票重新开放; “重复”问题并非特定于 MS-SQL 服务器,因此如果您正在寻找 MS-SQL,则必须浏览大量不相关的信息
  • @MarkSowul 它不是特定于 MS-SQL,它适用于 所有 SQL 类型,这就是规范重复的用途。此外,“浏览大量信息”是无稽之谈。 MS SQL 解决方案固定在 已接受答案 中的页面顶部(如果您愿意以这种方式对答案进行排序,则得分最高是 20 倍)。
  • 这不是“废话”(我以为我们应该在这里友好?)。 “接受的答案”并非一刀切(查看被投票的 cmets),如果您正在寻找特定的 DBMS,试图找到其他替代方案涉及许多其他不相关的答案,特别是因为大多数答案都没有甚至没有提及它们用于什么 DBMS。

标签: sql sql-server tsql


【解决方案1】:
SELECT * FROM table
ORDER BY NEWID()

【讨论】:

  • 对于 MySQL 使用 ORDER BY uuid()。 (...对于那些通过通用搜索到达此页面的人,例如我!)
  • 这行得通,但在我从(14M+ 行)中选择的表上速度非常慢。这是可以预期的吗? AFAIK,该表已正确编入索引。
  • @John - 您正在选择 1400 万条记录并通过唯一标识符生成和排序。也许你只是在一个随机的行之后?在这种情况下,请执行 SELECT TOP 1 FROM table ORDER BY NEWID()
  • @John Kraft - 如果数字在递增并且数字顺序中没有太多间隙,那么您可以使用 RAND 函数。 Declare InvoiceId INT SELECT InvoiceId = RAND() * (SELECT MAX(InvoiceId) - MIN(InvoiceId) FROM table) PRINT InvoiceId SELECT * FROM table where InvoiceId = InvoiceId 注意:InvoiceId 应该有 at 符号,但 SO 对此不满意
  • 这在 MySQL 中不起作用。
【解决方案2】:

这是最简单的解决方案:

SELECT quote FROM quotes ORDER BY RAND() 

虽然它不是最有效的。 This one 是更好的解决方案。

【讨论】:

  • 很确定这行不通。 ORDER BY 子句中的 RAND() 仅计算一次,因此您最终会得到自然顺序。要对其进行测试,请尝试 ORDER BY RAND(), 1,您将获得按第一列排序的引号列表(至少在 SQL Server 2005 中)。
  • 嗯,我很确定这在过去对我有用,也许这取决于您使用的产品。
  • 这不起作用,我猜你也没有尝试过。 RAND() 在 MS SQL Server 上的 SELECT 期间是固定的。你必须使用 NEWID()
  • 但是,它可以在 MySQL 上运行 :)
  • uuid() 和 newid() 技术在 mysql 上对我不起作用,这个答案可以。
【解决方案3】:

通常的方法是使用 NEWID() 函数,它生成一个唯一的 GUID。所以,

SELECT * FROM dbo.Foo ORDER BY NEWID();

【讨论】:

【解决方案4】:

为了高效且随机,最好有两个不同的查询。

类似...

从表中选择 table_id

然后,使用您选择的语言,选择一个随机 id,然后提取该行的数据。

SELECT * FROM table WHERE table_id = $rand_id

但是,如果您希望表中有很多行,那么这并不是一个好主意。如果您对随机选择的内容进行某种限制会更好。对于出版物,可能仅从去年发布的项目中随机挑选。

【讨论】:

    【解决方案5】:

    这是一个示例 (source):

    SET @randomId = Cast(((@maxValue + 1) - @minValue) * Rand() + @minValue AS tinyint);
    

    【讨论】:

      【解决方案6】:

      SQL Server/MS 访问语法:

      SELECT TOP 1 * FROM table_name ORDER BY RAND()
      

      MySQL 语法:

      SELECT * FROM table_name ORDER BY RAND() LIMIT 1
      

      【讨论】:

      • 问题被标记为 SQL Server。 RAND() 不起作用并且 LIMIT 无法识别,问题也没有要求将结果限制为一条记录。
      猜你喜欢
      • 2019-02-01
      • 2017-12-07
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      相关资源
      最近更新 更多