php随机不重复查询mysql数据库
php随机不重复查询mysql数据库
想完成多个表数据随机查询且不重复,也不太会。百度搜索一番找到一个办法是这样的。
(文中的代码就不替换了,直接粘贴自己的了。)
$result = $mysqli->query("select * from blog order by rand() limit 1");
这个方法的话说是有问题,查询大量数据效率低下,数据少问题不大(不过我这里的数据也不多)。所以又找到了一个随机id来查询。
$result = $mysqli->query("select * from blog where id >= (select floor(max(id) * rand()) from blog) limit 1");
这个问题是重复率很高。(如下)
也试图在sql语句上下手,看了很多有些看不懂。拿来尝试套上自己的代码有些问题,也许是不要求连续查询出几条的原因,还是好难实现。之后又发现了一个方法,程序内随机id再用于查询(这样来比在sql语句中随机重复的低,测试重复多的几条也许是因为所在表的数据很少10条都不到)。
$blogmaxid = mysqli_fetch_assoc($mysqli->query("select id from blog order by id desc limit 1"))["id"];//先获取到表的最大id
$blogid = rand(1, $blogmaxid);//随机数据
$result = $mysqli->query("select * from blog where id = {$blogid}");
至于为什么不用max(id),因为我这边好像行不通只能绕弯了。(看来的方法也是用max(id))
先查询,mysqli_fetch_assoc() 转成关联数组,最后取出来放到变量。
这个方法重复率会低很多。但是还是有些重复。那我就把先查询出来的存到数组,后查询出来的到数组中比较。重复再次查询(如果某张表数据太少可以随机到其他的表查询),无重复存到数组。最后就这样吧。
$data=array();
$itemspassurl=array();
$quantity = $_GET["quantity"];//前端获取查询条数
//获取各表的最大id
$blogmaxid = mysqli_fetch_assoc($mysqli->query("select id from blog order by id desc limit 1"))["id"];
$videomaxid = mysqli_fetch_assoc($mysqli->query("select id from video order by id desc limit 1"))["id"];
$articlemaxid = mysqli_fetch_assoc($mysqli->query("select id from article order by id desc limit 1"))["id"];
for($i=0;$i
while (true){
$types = rand(0, 2);//随机一张表查询
//$items["types"] = $types;将$types存入数组到时传到前端可以用
if ($types == 0) {
$blogid = rand(1, $blogmaxid);
$result = $mysqli->query("select * from blog where id = {$blogid}");
$items = mysqli_fetch_assoc($result);
$items["types"] = $types;
}
else if ($types == 1) {
$videoid = rand(1, $videomaxid);
$result = $mysqli->query("select * from video where id = {$videoid}");
$items = mysqli_fetch_assoc($result);
$items["types"] = $types;
}
else if ($types == 2) {
$articleid = rand(1, $articlemaxid);
$result = $mysqli->query("select * from article where id = {$articleid}");
$items = mysqli_fetch_assoc($result);
$items["types"] = $types;
}
//判断是否有重复记录,有继续循环,无记录到数组并跳出循环。
if(in_array($items["url"],$itemspassurl) != true){
array_push($itemspassurl,$items["url"]);
$data[] = $items;
break;
}
}
}
//输出数据
$arr = array('json'=>$data);
mysqli_close($mysqli);
echo json_encode($arr);
那我也不太清楚这样效率是否高,我这也没有很多的数据,这就是我目前想到的方法了。
php随机不重复查询mysql数据库相关教程