MariaDB rand()查询每次都不返回1行

时间:2016-01-17 06:02:43

标签: mysql

我有一个名为hit_counter的表。就是这个

CREATE TABLE `hit_counter` (
`id` tinyint(3) unsigned NOT NULL,
`cnt` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我插入了一些数据:

insert into hit_counter(id,cnt)
values(1,0),(2,0),(3,0),(4,0),(5,0),(6,0),(7,0),(8,0),(9,0),(10,0);

我的问题是: 我查询sql

select * 
  from hit_counter
 where id= floor(RAND()*10)+1;

查询返回0行或1行或2行。

为什么查询每次都不返回1行?

1 个答案:

答案 0 :(得分:0)

正在为从hit_counter检索到的每一行执行RAND()功能。

hit_counter检索一行。将id列的值与评估包含RAND()的表达式返回的结果进行比较。每次计算表达式时,它都会返回另一个值。

如果您的目的是评估包含RAND() 一次的表达式,然后使用结果查找匹配的id值,则可以使用查询像这样:

SELECT c.id
     , c.cnt
   FROM (SELECT FLOOR(RAND()*10)+1 AS n) i
   JOIN hit_counter c
     ON c.id = i.n

运行此查询时,内部查询(内联视图定义)将执行一次。视图查询(单行)的结果具体化为派生表。当外部查询运行时,该行保持不变。

原始查询的EXPLAIN输出显示hit_counter

的完整扫描
id  select_type  table        type    possible_keys  key     key_len  ref       rows  Extra        
--  -----------  -----------  ------  -------------  ------  -------  ------  ------  -------------
 1  SIMPLE       hit_counter  ALL     (NULL)         (NULL)  (NULL)   (NULL)      10  Using where  

重写查询的EXPLAIN输出:

id  select_type  table       type    possible_keys  key      key_len  ref       rows  Extra           
--  -----------  ----------  ------  -------------  -------  -------  ------  ------  ----------------
 1  PRIMARY      <derived2>  system  (NULL)         (NULL)   (NULL)   (NULL)       1                  
 1  PRIMARY      c           const   PRIMARY        PRIMARY  1        const        1                  
 2  DERIVED      (NULL)      (NULL)  (NULL)         (NULL)   (NULL)   (NULL)  (NULL)  No tables used  

请注意,hit_counter(别名c)的访问权限是主键。这意味着id列与之比较的值是常量