原始问题:
我目前正在使用 Zend 框架Zend_Db_*
,我正在从表中选择三个随机行:
$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 框架解决方案受到赞赏,但我可以调整其他解决方案以适应我的项目。
我知道使用 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 包含可以像任何其他数据库查询一样迭代的标准行集,它唯一不做的是将其粘贴在特定于表的行/行集类中,这可能有其缺点。