我目前正在使用带有Zend_Db_*
的Zend Framework,我从表中选择了三个随机行:
$category->getTable()->select()->order(new Zend_Db_Expr('RAND()'))->limit('3')
$category
是Zend_Db_Table_Row
的位置。我想抓取三个随机行,但是这三行按名为name
的列排序。
将->order()
更改为以下内容无效:
->order(array(new Zend_Db_Expr('RAND()'), 'name ASC'))
由于条目仍然显示无序,并且仍然是随机的。
Zend Framework解决方案表示赞赏,但我可以调整其他解决方案以适应我的项目。
我知道使用RAND()的扩展问题,数据库永远不会变得足够大,以至于成为一个问题,它做的那天我不必担心维护它,机器人将,如我早就死了! :-P
对于那些想知道这是如何最终使用Zend_Db_Select完成的人来说,这就是Zend_Db_Select中使用子选择的原因(我使用$category->findDefault_Model_projects()
来查找依赖行集,但这不允许我使用select()作为子选择,直到ZF-6461解决问题,我坚持我所拥有的):
$projects = new Default_Model_Projects();
$subselect = $projects->select()->order(new Zend_Db_Expr('RAND()'))->limit('3')->where('cid = ?', $category->id, Zend_Db::INT_TYPE);
$db = $projects->getAdapter();
$select = $db->select()->from(array("c" => new Zend_Db_Expr("({$subselect})")))->order('name');
$stmt = $select->query();
$projects = $stmt->fetchAll();
生成的SQL是:
SELECT `c`.* FROM (SELECT `projects`.* FROM `projects` WHERE (cid = 1) ORDER BY RAND() LIMIT 3) AS `c` ORDER BY `name` ASC
从那里$ projects包含标准行集,它可以像任何其他数据库查询一样进行迭代,唯一不做的就是将它放在特定于表的行/行集类中,这可能有它的缺点。 / p>
答案 0 :(得分:4)
您的初始解决方案不正确,因为此查询将为每一行生成一个随机值以及基于它的行的顺序,仅在随机值相等的情况下按名称排序(这是非常不可能的)。
问题可以通过下面的子查询来解决
select * from (select * from categories order by rand() limit 3) c order by name
我将把这个翻译成Zend_Db语言的任务留给你。
答案 1 :(得分:1)
$subQuery = $this->select()->from('picture')->order(new Zend_Db_Expr('RAND()'))->limit(count($this->selectAll()));
$select->setIntegrityCheck(false)
->from($subQuery);
这就是我所做的,它的工作原理。干杯!
答案 2 :(得分:0)
为什么不创建一个按名称对数据进行排序的Rowset Subclass函数?
答案 3 :(得分:0)
试试这个:
$select = $this->select();
$select->order('RAND(), name');
$select->limit(3);
return $this->fetchAll($select);
这对我有用,所以它也适合你。