mysql查询一段时间内的10个抽样值,不是全部。

mysql查询一段时间内的10个抽样值,不是全部。,第1张

select * from 表名 where 时间 between 开始时间 and 结束时间 order by rand() limit 10

其中order by rand()是随机,后边的10是10条的意思

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

*

FROM

tablename

ORDER

BY

RAND()

LIMIT

1。

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

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

3.23版本中,仍然可以通过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

t1.id

>=

t2.id

ORDER

BY

t1.id

ASC

LIMIT

5

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

下面的语句采用的是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

t1.id

>=

t2.id

ORDER

BY

t1.id

LIMIT

1

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

前者花费时间

0.147433

后者花费时间

0.015130

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

1、Oracle查询结果集,随机排序

select * from tableName order by dbms_random.value()

2、MySQL随机查询,随机排序

SELECT * FROM tableName ORDER BY rand()

3、SQL随机查询,随机排序

SELECT *  FROM tableName  ORDER BY NEWID()

4、Oracle随机查询20条

select * from

 select  *  from tableName    order by dbms_random.value

)

 where rownum <= 20

5、My SQL随机查询20条

select  *  from  tableName  order by rand() limit 20

6、MS SQL Server随机查询20条

select top 20  * from  tableName order by newid()


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

原文地址: http://outofmemory.cn/zaji/8307627.html

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

发表评论

登录后才能评论

评论列表(0条)

保存