环境:MySQL,PHP 5.5
我有一种情况,我需要从数据库中返回一个随机结果。我尝试了两种方法来做到这一点。一个返回结果数组,我使用 随机选择一个array_rand($results)
,另一个是添加order by rand() limit1
;
当我返回结果列表时,MySQL 控制台报告的执行时间记录如下:
602 rows in set (0.05 sec)
Query OK, 0 rows affected (49.37 sec)
情况不妙。所以我选择了另一种报告的方法:
1 row in set (0.05 sec)
Query OK, 0 rows affected (0.36 sec)
当第二次运行此查询时,问题就出现了,我传入了记录检索到的上一条记录的 arg,因此我避免了重复
这是我的日常:
CREATE PROCEDURE `getRandomRecord`(
IN _args varchar(100)
)
BEGIN
SET @query = CONCAT('SELECT C.*, B.*
FROM C
LEFT JOIN B
ON B.id = c.Bid
where (C.Type=27 || C.Type=28 || C.Type=29)
and C.EndDate>CURRENT_TIMESTAMP() ',_args,' order by rand() limit 1;');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END//
这第一次执行没有问题,但在 PHP 端,当我第二次运行时调用失败。
args 的记录如下:
$args= !empty($args) ? $args : '';
//args is empty first time
$dbHandler = new RandomRecordDatabase();
$results = $dbHandler->getRandomRecord($args);
//Do Stuff HERE
$args .= ' AND C.id!='.$results['C.id'];
$dealer_results = $dbHandler->getRandomRecord($args);
函数是这样的:
public function getRandomRecord($args){
try
{
$procedure = "Call getRandomRecord(?)";
$statement = $this -> _dbh -> prepare($procedure);
$statement -> bindParam(1, $args);
$statement -> execute();
$results = $statement -> fetchAll(PDO::FETCH_ASSOC);
return $results[0];
}
catch(PDOException $e)
{
echo $e -> getMessage();
}
}
在第二次调用此方法时,我得到以下 PDOException:
Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"387 order by rand() limit 1'
引用该行$statement -> execute();
我该如何解决这个错误?谢谢!
更新(解决方案):
我应该更仔细地查看 args 的输出,我会看到错误:echo $args;
在一个例子中,我注意到一个混合情况:“ AND C.id=123 AND AND C.id=456 and C.id="111" AND C.id=789。
我修改了一个我从未注意到位于不同脚本中的案例。这现在解决了这个问题。