帝国论坛帝国网站管理系统交流区模板/标签/插件共享交流[原创]终于搞定了随机调用,和大家分享下 【本版专题贴子】  
 6/8    |‹ ‹‹ 4 5 6 7 8 ›› ›|
主题:[原创]终于搞定了随机调用,和大家分享下 [加入收藏夹]   

455ax
用户头衔:探花

精华贴   :0
发贴数   :7144
经验值   :19059
注册时间:2007-05-29
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 51 楼]

原帖由 Borton 于 2009-06-12 09:32:51 发表
classid='$GLOBALS[navclassid]'
用这个表示当前栏目
这个强啊,已经修改

很早就知道了




2009-06-12 15:34:26 已设置保密 顶部 回复 引用 报告 编辑 删除

zagj11
用户头衔:举人

精华贴   :0
发贴数   :195
经验值   :763
注册时间:2007-09-18
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 52 楼]

打个标记。



.
2009-11-13 15:45:51 已设置保密 顶部 回复 引用 报告 编辑 删除

zagj11
用户头衔:举人

精华贴   :0
发贴数   :195
经验值   :763
注册时间:2007-09-18
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 53 楼]

SELECT * FROM `table` ORDER BY RAND() LIMIT 5
就可以了。
但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上

搜索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秒不到。

于是我把语句改写了一下。

SELECT * FROM `table`
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))  
ORDER BY id LIMIT 1;
这下,效率又提高了,查询时间只有0.01秒

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

SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))  
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中使用函数效率还要高很多。



.
2009-11-13 15:57:29 已设置保密 顶部 回复 引用 报告 编辑 删除

xuexi
用户头衔:书生

精华贴   :0
发贴数   :31
经验值   :142
注册时间:2009-04-27
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 54 楼]

原帖由 Borton 于 2009-06-12 09:32:51 发表
classid='$GLOBALS[navclassid]'
用这个表示当前栏目
这个强啊,已经修改



加上了这个,就非常有用了 !!
是在哪发现的这个方法啊~我想学习研究下sql~~

下面这个是随机查询 本栏目信息(栏目id在数据库里面是classid不是 id)

[ecmsinfo]"select * from phome_ecms_news where classid='$GLOBALS[navclassid]' order by rand() desc limit 26 ",26,18,0,24,16,0[/ecmsinfo]

已测试,可用!




2009-12-08 22:53:33 已设置保密 顶部 回复 引用 报告 编辑 删除

lose_ever
用户头衔:书生

精华贴   :0
发贴数   :25
经验值   :75
注册时间:2009-12-23
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 55 楼]




www.mianfeimoban.com
www.xiuyixiang.com
2009-12-23 13:26:02 已设置保密 顶部 回复 引用 报告 编辑 删除

sidashuai
用户头衔:书生

精华贴   :0
发贴数   :68
经验值   :230
注册时间:2009-12-16
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 56 楼]
[分享]
    这里可以添加链接的啊。不用直接复制链接地址的,呵呵 。     http://www.bingdou.net/article/xuexi/2009-12-26/904.html



冰豆网络 寻找友情链接合作网站
网站建设(各种CMS程序修改,模板制作,网站开发)
办公OA CRM
免费网站空间(空间支持PHP/ASP/ASP.net,可以免费,但要教给我点东西^_^)
2009-12-26 20:08:07 已设置保密 顶部 回复 引用 报告 编辑 删除

zagj11
用户头衔:举人

精华贴   :0
发贴数   :195
经验值   :763
注册时间:2007-09-18
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 57 楼]

利用MySQL的ROUND()加上RAND()函数实现
#一句sql语句搞定
#auther: 小强(占卜师)
#date: 2008-03-31

SELECT ROUND((0.5-RAND())*2*5)
#注释
#0.5-rand()可以得到-0.5 至 +0.5的随机数
#(0.5-rand())*2可以得到-1 至 +1的随机数
#(0.5-rand())*2*5可以得到-5 至 +5的随机数
#ROUND((0.5-RAND())*2*5)可以得到-5 至 +5的随机整数

优点: 当随机数范围很广的时候,只需要更改*5当中的5即可,非常方便.
缺点: 随机数只能是连续的,不可以指定某部分数据.




.
2010-01-02 10:37:45 已设置保密 顶部 回复 引用 报告 编辑 删除

youfu125
用户头衔:书生

精华贴   :0
发贴数   :78
经验值   :229
注册时间:2009-10-07
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 58 楼]

支持楼主,收藏了,顶,



帝国交流,纯技术交流群,欢迎开发者和群众,杜绝AD!

【帝国CMS爱好者 81770182 】

欢迎精通帝国和dz的朋友QQ506724358
2010-02-16 23:11:40 已设置保密 顶部 回复 引用 报告 编辑 删除

wangbinyuyao
用户头衔:进士

精华贴   :0
发贴数   :424
经验值   :1886
注册时间:2007-11-19
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 59 楼]

支持一下



区号查询 http://www.aaab.cn/
2010-03-01 23:07:59 已设置保密 顶部 回复 引用 报告 编辑 删除

snkv3000
用户头衔:秀才

精华贴   :0
发贴数   :136
经验值   :422
注册时间:2010-03-04
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 60 楼]

这个帖子解决大问题了。

推荐图片随机展示代码:
======================================================================
[phomenewspic]'selfinfo',3,9,80,45,0,20,2[/phomenewspic]
【加入SQL语句,随机读取。】
======================================================================
[phomenewspic]"select * from phome_ecms_photo order by rand() desc limit 9",3,9,80,45,0,20,2[/phomenewspic]
【操作类型为24。SQL操作。】
======================================================================
[phomenewspic]"select * from phome_ecms_photo order by rand() desc limit 9",3,9,80,45,0,20,24[/phomenewspic]
【读取推荐图片】
======================================================================
[phomenewspic]"select * from phome_ecms_photo where isgood=1 and titlepic<>'' order by rand() desc limit 9",3,9,80,45,0,20,24[/phomenewspic]
【读取指定栏目下的推荐图片】
======================================================================
[phomenewspic]"select * from phome_ecms_photo where classid in (1,3) and isgood=1 and titlepic<>'' order by rand() desc limit 9",3,9,80,45,0,20,24[/phomenewspic]
【在当前栏目中查询】
======================================================================
[phomenewspic]"select * from phome_ecms_photo where classid='$GLOBALS[navclassid]' and isgood=1 and titlepic<>'' order by rand() desc limit 9",3,9,80,45,0,20,24[/phomenewspic]

[该贴被修改 1 次,最后修改时间 2010-04-30 20:01:06 ]



2010-04-30 20:00:33 已设置保密 顶部 回复 引用 报告 编辑 删除
 6/8    |‹ ‹‹ 4 5 6 7 8 ›› ›|

快速回复
内容

表情
使用EBB代码 使用smile代码 显示签名 自动分析url 自动分析img
     【进入高级模式】   (按 Ctrl+Enter 直接提交)
    顶部  加入收藏夹
关于帝国 | 广告服务 | 联系我们 | 法律声明 | 隐私条款 | 许可协议
Powered by: EBB Version 2.2.1