从mysqli准备好的语句中选择随机行

神秘的发展

我正在研究从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代码。
来源:http//akinas.com/pages/en/blog/mysql_random_row/(解决方案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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQLI使用准备好的语句从表中选择

来自分类Dev

从准备好的语句中检索值并在Go中选择查询

来自分类Dev

在MySQLi准备好的语句中,STMT代表什么?

来自分类Dev

在 PHP MySQLi 准备好的语句中结合 LIKE 和 IN

来自分类Dev

php mysqli在准备好的语句中重复字段

来自分类Dev

在准备好的语句中准备失败

来自分类Dev

选择使用mysqli准备好的语句吗?

来自分类Dev

选择使用mysqli准备好的语句吗?

来自分类Dev

如何使用 MySQLi 和准备好的语句将一行选择导出到 JSON

来自分类Dev

在准备好的语句中设置一行null

来自分类Dev

mysqli准备好的语句删除新行

来自分类Dev

准备好的语句中的异常

来自分类Dev

准备好的语句中的异常

来自分类Dev

准备好的语句中的$ row [''] PHP

来自分类Dev

嵌套MySQLi准备好的语句

来自分类Dev

mysqli函数内部准备好的语句

来自分类Dev

从mysqli准备好的语句创建数组

来自分类Dev

mysqli到准备好的语句

来自分类Dev

mysqli 准备好的语句顺序

来自分类Dev

选择准备好的语句行数

来自分类Dev

在准备好的mysqli语句中多次使用一个参数

来自分类Dev

在准备好的语句中使用LIKE'%{$ var}%'的正确方法?[mysqli]

来自分类Dev

使用准备好的语句从带有限制标记的数据库中选择

来自分类Dev

mysqli准备好的语句返回0行,没有错误

来自分类Dev

从准备好的语句中获取文本(PHP,PDO)

来自分类Dev

“在准备好的语句中未提供参数数据”

来自分类Dev

在PHP准备好的语句中插入日期

来自分类Dev

准备好的sql语句中的int的Python列表

来自分类Dev

准备好的SQL语句中的NodeJS MSSQL WHERE