Mysql mariabrand()查询不会每次返回1行

Mysql mariabrand()查询不会每次返回1行,mysql,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

我有一张名为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行

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

正在为从命中计数器检索到的每一行执行
RAND()
函数

从点击计数器中检索一行。将
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
运行此查询时,将执行一次内部查询(内联视图定义)。视图查询的结果(一行)具体化为一个派生表。当外部查询运行时,该行保持不变


原始查询的解释输出显示
命中计数器的完整扫描

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  
重新编写的查询的解释输出:

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  
id选择类型表类型可能的键长度参考行额外
--  -----------  ----------  ------  -------------  -------  -------  ------  ------  ----------------
1主系统(空)(空)(空)(空)(空)1
1主c常量主1常量1
2派生(空)(空)(空)(空)(空)(空)(空)(空)(空)(空)未使用表

请注意,通过主键可以访问
点击计数器
(别名
c
)。这意味着比较
id
列的值是常量。

我也在MSSQL中尝试了相同的查询,RAND()似乎只计算了一次(我认为这更直观)。非常感谢!你的分析很有道理。但是mysql和MariaDB的rand函数是一样的?我也在mysql上测试过(服务器版本:5.5.21-log mysql),结果是一样的。非常感谢你。