Mysql mariabrand()查询不会每次返回1行
我有一张名为hit_counter的桌子。就是这个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
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),结果是一样的。非常感谢你。