欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

php随机不重复查询mysql数据库

程序员文章站 2022-03-06 18:03:58
...

想完成多个表数据随机查询且不重复,也不太会。百度搜索一番找到一个办法是这样的。

(文中的代码就不替换了,直接粘贴自己的了。)

$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");

这个问题是重复率很高。(如下)

php随机不重复查询mysql数据库

也试图在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<$quantity;$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数据库

那我也不太清楚这样效率是否高,我这也没有很多的数据,这就是我目前想到的方法了。

相关标签: mysql php