【问题标题】:how to randomly sample rows from msql tables with no rowid [duplicate]如何从没有rowid的sql表中随机采样行[重复]
【发布时间】:2015-12-12 08:36:23
【问题描述】:

我正在寻找一种对 mysql 表进行随机采样的方法,并且正在阅读这篇文章 - http://jan.kneschke.de/projects/mysql/order-by-rand/

但是,这不适用于我的情况,因为 mysql 中的许多表都没有“rowid”/autoincrement 列。在这种情况下,我还有办法随机抽样行吗?

这是表结构:

    'CREATE TABLE `table_name` (
  `col1` date DEFAULT NULL,
  `col2` bigint(20) DEFAULT NULL,
  `col3` varchar(255) DEFAULT NULL,
  `col4` varchar(64) DEFAULT NULL,
  `col5` varchar(64) DEFAULT NULL,
  `col6` bigint(20) DEFAULT NULL,
  `col7` bigint(20) DEFAULT NULL,
  `col8` varchar(255) DEFAULT NULL,
  `col9` decimal(16,5) DEFAULT NULL,
  `col10` bigint(20) DEFAULT NULL,
  `col11` varchar(64) DEFAULT NULL,
  `col12` bigint(20) DEFAULT NULL,
  `col13` bigint(20) DEFAULT NULL,
  `col14` bigint(20) DEFAULT NULL,
  `col15` bigint(20) DEFAULT NULL
) ENGINE=BRIGHTHOUSE DEFAULT CHARSET=utf8'

【问题讨论】:

  • 根据选择语句中“随机”生成的额外列进行选择,例如SELECT TOP 50 * FROM myTable WHERE rand() % 5 = 1
  • 我实际上正在查看该帖子,但我认为其中一个假设是表中有一个唯一的、索引的主键,而我没有。当我按 rand() 限制 10 从表顺序中选择 column1 时,我得到表中该列的前 10 个条目。
  • @RogerWillcocks - 听起来不错,但我不确定如何在我的查询中生成额外的列,还有 rand()%5 = 1 有什么作用?
  • 您能否提供您的表结构(创建语句)。我只是在没有自动增量列的表上尝试过它,它可以工作。 select * from settings order by rand() limit 10; 每次运行时都会给出不同的随机选择。
  • @DavidFairbanks - 我刚刚建立了表格结构。每次运行它都会得到相同的数据。

标签: mysql


【解决方案1】:

要在您的 sql 中生成一个字段,请执行以下操作:

 select * 
   from (select @id:=@id+1, a.* 
           from `table_name` a,
                (select @id:=0) b
        ) x 
  order by rand() limit 10

这部分sql

from `table_name` a,
     (select @id:=0) b

将在您的表和仅一行的选择之间创建一个笛卡尔计划。然后在它之外,您只需增加该变量@id:=@id+1。您将拥有生成的字段。

然后将其包装为子查询并按 rand 排序。

SQLFiddle

要测试它,只需继续点击 Run Sql 按钮。

编辑

由于它不适用于“infobright Optimizer”,请尝试使用普通的 mysql 函数,看看会发生什么:

 select * from (
 select n id, a.* 
   from `table_name` a,
       (select RAND() n) b
  ) x order by rand() limit 5

看这里SQLFiddle 2

您会看到随机数是相同的,但 col2 值会随着每次点击“运行 sql”按钮而改变。

【讨论】:

  • 谢谢,SQLFiddle 很棒,它可以在这方面工作,但是当我在我的数据库上尝试它时,我收到错误“查询包含 infobright 优化器不支持的语法”
猜你喜欢
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
相关资源
最近更新 更多