mysql随机取字段内容,谢谢!

mysql随机取字段内容,谢谢!,第1张

给你写了个存储过程,实现你的要求,测试成功:

delimiter //

create procedure get_rand_record()

begin

set @rand_num=(select floor(rand()(select count() from studinfo)));

set @sql2=concat('select from studinfo limit ',@rand_num,',1');

prepare exec2 from @sql2;

execute exec2;

end //

delimiter ;

上述存储过程你可以建在文本文件里,用 mysql 的 source 命令导入到你那个数据库中,然后执行 call get_rand_record(); 命令即可得到 studinfo 表中的随机记录(无需指定 id),每次执行取得的结果都随机的。

要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT

FROM

tablename

ORDER

BY

RAND()

LIMIT

1。

但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER

BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL

323版本中,仍然可以通过ORDER

BY

RAND()来实现随机。

但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在ORDER

BY

子句中会被执行多次,自然效率及很低。

复制代码

代码如下:

You

cannot

use

a

column

with

RAND()

values

in

an

ORDER

BY

clause,

because

ORDER

BY

would

evaluate

the

column

multiple

times

搜索Google,网上基本上都是查询max(id)

rand()来随机获取数据。

复制代码

代码如下:

SELECT

FROM

`table`

AS

t1

JOIN

(SELECT

ROUND(RAND()

(SELECT

MAX(id)

FROM

`table`))

AS

id)

AS

t2

WHERE

t1id

>=

t2id

ORDER

BY

t1id

ASC

LIMIT

5;

但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要001秒不到。

下面的语句采用的是JOIN,mysql的论坛上有人使用

复制代码

代码如下:

SELECT

FROM

`table`

WHERE

id

>=

(SELECT

FLOOR(

MAX(id)

RAND())

FROM

`table`

)

ORDER

BY

id

LIMIT

1;

再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。

完整查询语句是:

复制代码

代码如下:

SELECT

FROM

`table`

2

WHERE

id

>=

(SELECT

floor(

RAND()

((SELECT

MAX(id)

FROM

`table`)-(SELECT

MIN(id)

FROM

`table`))

+

(SELECT

MIN(id)

FROM

`table`)))

3

ORDER

BY

id

LIMIT

1;

复制代码

代码如下:

SELECT

FROM

`table`

AS

t1

JOIN

(SELECT

ROUND(RAND()

((SELECT

MAX(id)

FROM

`table`)-(SELECT

MIN(id)

FROM

`table`))+(SELECT

MIN(id)

FROM

`table`))

AS

id)

AS

t2

WHERE

t1id

>=

t2id

ORDER

BY

t1id

LIMIT

1;

最后在php中对这两个语句进行分别查询10次,

前者花费时间

0147433

后者花费时间

0015130

看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。

以上就是关于mysql随机取字段内容,谢谢!全部的内容,包括:mysql随机取字段内容,谢谢!、MYSQL随机抽取查询 MySQL Order By Rand()效率问题、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9535888.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存