Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从mysqli prepared语句中选择随机行_Php - Fatal编程技术网

Php 从mysqli prepared语句中选择随机行

Php 从mysqli prepared语句中选择随机行,php,Php,我在研究MYSQL表中的随机选择。我发现ORDER BY RAND在大型数据库上的速度非常慢。我试图合并一个不同的方法,但在返回时我一直得到一个空查询。我不习惯AS语句,所以我的代码可能有问题 public function getSmilies( $limit = null, $random = null ) { $query = "SELECT find, url, id FROM smilies"; if($random == 1) { $query

我在研究MYSQL表中的随机选择。我发现ORDER BY RAND在大型数据库上的速度非常慢。我试图合并一个不同的方法,但在返回时我一直得到一个空查询。我不习惯AS语句,所以我的代码可能有问题

public function getSmilies( $limit = null, $random = null )
{
    $query = "SELECT find, url, id FROM smilies";
    if($random == 1)
    {
        $query .= " AS r1 JOIN (SELECT (RAND() * (SELECT MAX(id) FROM smilies)) AS id) AS r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC";
    }
    if($limit != null)
    {
        $query .= " LIMIT " . (int)$limit;
    }

    $stmt = $this->link->prepare($query);
    $stmt->execute();
    $stmt->bind_result( $find, $url, $id );
    while($stmt->fetch())
        $row[] = array('find' => $find, 'url' => $url, 'id' => $id );
    $stmt->close();
    return $row;
}
当没有参数传递给函数时,代码工作正常,但是当我添加随机参数时,它似乎失败了。

MySQL查询:

SELECT * FROM smilies WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM smilies ) LIMIT 5;
完整的PHP代码:

public function getSmilies( $limit = null, $random = null )
{
    $query = "SELECT find, url, id FROM smilies";
    if($random == 1)
    {
        $query .= " WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM smilies)";
    }
    if($limit != null)
    {
        $query .= " LIMIT " . (int)$limit;
    }

    $stmt = $this->link->prepare($query);
    $stmt->execute();
    $stmt->bind_result( $find, $url, $id );
    while($stmt->fetch())
        $row[] = array('find' => $find, 'url' => $url, 'id' => $id );
    $stmt->close();
    return $row;
}
注1:这仅适用于唯一ID。 注2:只测试了MySQL查询,没有测试PHP代码。 资料来源:解决方案3

编辑:使用PHP的另一个选项

public function getSmilies( $limit = null, $random = null )
{
    $query = "SELECT find, url, id FROM smilies";
    if($limit != null)
    {
        $query .= " LIMIT " . (int)$limit;
    }
    $stmt = $this->link->prepare($query);
    $stmt->execute();
    $stmt->bind_result( $find, $url, $id );
    while($stmt->fetch())
        $row[] = array('find' => $find, 'url' => $url, 'id' => $id );
    $stmt->close();
    if($random == 1)
    {
        suffle($row);
    }
    return $row;
}

您使用的参数是什么。我的猜测是,您正在通过参数触发一个不同的代码路径,并可能因此创建一个无效的SQL语句。我会回显该语句,看看它是在mysql还是在phpmyadmin中执行。@dboals我会试试看。我猜是随机语句。@dboals是的,这个查询不起作用选择find,url,id FROM smilies AS r1 JOIN SELECT RAND*选择MAXid FROM smilies AS id AS r2其中r1.id>=r2.id ORDER BY r1.id ASC LIMIT 100,但原始的是。我的SQL有点生疏,但它不是一个JOIN使用ON语句而不是WHERE语句。看起来您可能想更改r1.id>=r2.id的使用位置,而不是这回答了我的问题的位置,我会在允许的情况下奖励您。但有一个问题,我怎样才能使它不跳过丢失的id?不总是选择$limit如果您想随机响应,最好从smilies查询select*,然后在PHP中使用shuffle响应。编辑:我将添加一个PHP函数示例。您就可以看到它了。希望这就是你想要的。