table1 有个字段weight记录0~5的整数,我要从表中虽机select出8条记录,要求weight值越高的,被select出来的机率越高
解决方案 »
- 新手提问:关于HTML5移动应用结合php写后台数据处理的问题
- php问题——在客户端弹出服务器端的另存为对话框
- 图片删除之后,显示默认图片,而不是什么都不显示?
- 最基本的,php和apache的安装。
- 在PHP与MySql制作站点时,使用中间件ODBC连接数据库时总是出问题,请问各位高手,这应该怎样解决啊,谢谢!
- 急啊!!!哪位高手知道在网页中如何取得电脑的网卡MAC地址?
- PHP中字符串替换函数的问题。奇怪~~!
- php和javascript(或jscript)之间传递参数有哪几种方式?
- php生成的pdf文件如何支持中文
- 给个答案好吗?
- 这样的参数是如何接受的?
- php当数据库有新的数据加入时,要在网页上无刷新立刻弹出窗口,并显示其内容,如何实现? [
试试这个:select * from table1 order by floor(1+rand()*5) limit 8;
就可以,
weight=5, weight-rand()*5 => 0~5
weight=4, weight-rand()*5 => -1~4
weight=3, weight-rand()*5 => -2~3
weight=2, weight-rand()*5 => -3~2
weight=1, weight-rand()*5 => -4~1
weight=0, weight-rand()*5 => -5~0
自然weight=5的容易排到前面
额... 你那个应该是weight=5的容易排到后面吧
create table lk11(
id int not null auto_increment primary key,
weight int
);
insert into lk11(weight) values
(1),(2),(5),(3),(2),(3),(4),(4),(5),(3),(1),(3),(2),(4),(5);create index `k_w` on lk11(weight);
weight = 5, 0~6
weight = 4, 0~5
weight = 3, 0~4
weight = 2, 0~3
wegith = 1, 0~2
weight = 0, 0~1
有个比较简单的方法, 你可以列一个表~~
比如:
如果你需要
weight值 出现概率 出现条件
5 30%=0.3 rand()<0.3
4 25%=0.25 rand()<0.55
3 20%=0.2 rand()<0.75
2 15%=0.15 rand()<0.9
1 10%=0.1 rand()<1可以这么写:
SELECT * from tablename
where
rand()<
CASE weight
WHEN 5 THEN 0.3
WHEN 4 THEN 0.55
WHEN 3 THEN 0.75
WHEN 2 THEN 0.9
WHEN 1 THEN 1
END 这样出来的是按照上面比例几率出现, 但是一般不止8条, 那么再平均随机从里面抽8条select * from
(
SELECT * from tablename
where
rand()<
CASE weight
WHEN 5 THEN 0.3
WHEN 4 THEN 0.55
WHEN 3 THEN 0.75
WHEN 2 THEN 0.9
WHEN 1 THEN 1
END
) x
order by rand()
limit 8这样能达到效果,但是这个语句无疑可以简化一下, 我先发了, 等我再看一下
from tablename
where
rand() <
CASE weight
WHEN 5 THEN 0.3
WHEN 4 THEN 0.55
WHEN 3 THEN 0.75
WHEN 2 THEN 0.9
WHEN 1 THEN 1
END
order by ord
limit 8和上面的同样效果但是,这个语句的效率是很差的,
两个rand()还要过滤和排序.....索引无法用....
如果你数据不大, 要求不高, 思想不复杂, 人品不算好.....
更重要的...老板给钱不多的话,先用...下次改进的时候再要钱
我待会再继续聊
想想如果weight=1的有1000000000个, weight=5的有10个, 那么最终结果里出现5的概率肯定是非常非常小的...如果你说的几率是出现在最终结果的几率....和weight的多少无关的话....
那么实际上....选8个....
weight 概率 结果里大概
5 0.3 8*0.3 ~=~ 2.4 个
4 0.25 8*0.25 ~=~ 2 个
3 0.2 8*0.2 ~=~ 1.6 个
2 0.15 8*0.15 ~=~ 1.2 个
1 0.1 8*0.1 ~=~ 0.8 个你就照这个比例随机取吧.......嘿嘿.......
要逼真的话, 再用rand()让结果个数"晃动"一下,比如weight5的这次取3个,下次取2个,再下次取4个....最终平均下来接近2.4就行.....