好的就是这种环境,我有一个用Zend_Framework编写的应用措施,它兼容MySQL和MSSQL作为后端.此刻,ZF很是善于办理这两种说话之间的很多SQL差别/差别,但我还没有想出这个.
方针是从表中选择1个随机记录,这是一个很是简朴的告诉.
这是一个select语句,譬喻:
$sql = $db->select()
->from("table")
->order("rand()")
->limit(1);
这合用于MySQL数据库表,由于MySQL的sql如下:
SELECT `table`.* FROM `table` ORDER BY rand() ASC
另一方面,此刻MSSQL行使newid()函数举办随机化.
有没有某种辅佐我可以转达给order()函数,以使它意识到它必需行使正确的次序?我搜刮了文档和zfforums,发明白一些提醒,但没有什么靠得住的.
我找到的个中一件事是:
ORDER BY RANDOM() not working – ZFForums.com
他们行使以下内容:
$res = $db->fetchAll(
'SELECT * FROM table ORDER BY :random',array('random' => new Zend_Db_Expr('RANDOM()')
);
它事变…但我不规划通过键入它并对字符串举办替代来构建我的select语句,我试图将它生涯在沟通的Zend_Db_Select工具中.我也实行将Zend_Db_Expr(‘RANDOM()’)传入语句中的 – > order(),但它失败了.他还宣布了一个理论办理方案来找到谜底,但我不规划重写这个函数,修改$db-> fetch()挪用.
有任何设法吗?
最佳谜底
您可以快速将函数抽象到表中 – 谁知道它正在行使哪个适配器:
class MyTable extends Zend_Db_Table_Abstract {
public function randomSelect($select=null) {
if ($select === null) $select = $this->select();
if (!$select instanceOf Zend_Db_Select) $select = $this->select($select);
$adapter = $this->getAdapter();
if ($adapter instanceOf Zend_Db_Adapter_Mysqli) {
$select->order(new Zend_Db_Expr('RAND()'));
} else if ($adapter instanceOf Zend_Db_Adapter_Dblib) {
$select->order(new Zend_Db_Expr('NEWID()'));
} else {
throw new Exception('Unknown adapter in MyTable');
}
return $select;
}
}
$someSelect = $table->select();
// add it to an existing select
$table->randomSelect($someSelect);
// or create one from scratch
$select = $table->randomSelect();
其它,我在某个处所找到了一篇我遗失的文章,提议实行以下要领:
$select->order(new Zend_Db_Expr('0*`id`+RAND()));
倾覆MSSQL的查询优化器并诱骗它计较每一行的新值.
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|