Php 从mysqli prepared语句中选择随机行
我在研究MYSQL表中的随机选择。我发现ORDER BY RAND在大型数据库上的速度非常慢。我试图合并一个不同的方法,但在返回时我一直得到一个空查询。我不习惯AS语句,所以我的代码可能有问题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
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函数示例。您就可以看到它了。希望这就是你想要的。