我发现很多php老手或高手都犯了一个严重错误,请看详细说明。
php吧
全部回复
仅看楼主
level 1
花生米1979 楼主
我连续几次在百度知道提了同一个问题:
选择“数据库的表里”符合某个条件的多条数据后(注意是多条,也就是多row),然后怎么再随机选取一条(一条row)?
结果很多php回答者都:
$x=mysql_query("SELECT * FROM 表名字 WHERE 字段名字='AAA'", $con);
$row=mysql_fetch_array($x);
把这个 $x 或者 $row 都当作符条件的多条数据!!!其实它只选择到一条数据,也就是1排数据,
然后他们继续错误的用array_rand(),来随机选择一个,其实这时随机获得是该排数据的某一个字段的值。
为什么很多高手都犯这样的错误,如果你这时用 print_r($x)或者 print_r($row)都会发现就只有一条数据(1排数据)。
那么怎样才能获取全部数据,也就是多排数据,然后在随机选择一排。
2015年04月15日 13点04分 1
level 11
查询返回的是2维数组,随机取一行出来就行
2015年04月15日 13点04分 3
查询返回的是2维数组,的确,但只有一条,也就是一排
2015年04月15日 13点04分
回复 花生米1979 :可以循环,赋值给一个新的数组
2015年04月15日 13点04分
是的,要用循环才得到多个数据,然后把他们揉进一个数组,然后再数组随机,我本是这样的想的,但想有个更简单的方法,否则如果符合条件的数据太多,数组就会很大,影响执行效率
2015年04月15日 13点04分
@Crack🙀 这个问题,解决了,很简单的办法,请看下面回复
2015年04月15日 13点04分
level 7
select * from table where id = (select round(rand()*(select max(id) from table)) as nid) limit 1;
或者直接
select * from table order by rand() limit 1;//忽略索引
2015年04月15日 13点04分 4
select * from table order by rand() limit 1; 这个办法有戏,马上去试试
2015年04月15日 13点04分
成功了!高手,其实limit 1不需要,因为只需一条,而select * from就只取了一条
2015年04月15日 13点04分
回复
������1979
:第一条可以不用limit,第二条需要limit。第一条性能更高,第二条会忽略索引,所以效率低下。
2015年04月15日 15点04分
感觉第一种写法有问题,如果round( rand() * maxid )得到的ID对应的记录被删掉了怎么办?
2015年04月16日 02点04分
level 10
连这么低级的错误都犯就不叫高手了
2015年04月15日 14点04分 5
还是这里高手多
2015年04月15日 14点04分
level 10
原本sql语句就可以实现啊[黑线]倒是没见过有人提出过用你所说的方法
2015年04月15日 14点04分 7
level 7
你可以用while($singleRow=@mysql_fetch_array($res))循环一下看看
2015年04月15日 14点04分 8
level 14
array_rand() 不知道返回的是键值的 这是小菜鸟 ...
如果返回数量少 直接mt_rand(0, 总数-1) 即可
至少有N种办法得到随机
2015年04月15日 15点04分 10
level 11
不要用SQL语句做随机
或者说:不推荐用SQL语句做任何逻辑操作
2015年04月16日 01点04分 11
1