我有一个名为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行?
答案 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
列与之比较的值是常量。