如何从没有rowid的msql表中随机抽样行

时间:2015-09-15 23:01:58

标签: mysql

我正在寻找一种随机抽样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'

1 个答案:

答案 0 :(得分:0)

要在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"按钮。