【发布时间】:2009-07-17 18:58:20
【问题描述】:
原问题:
我目前正在使用带有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 框架解决方案值得赞赏,但我可以调整其他解决方案以适应我的项目。
我知道使用 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 包含可以像任何其他数据库查询一样迭代的标准行集,它唯一不做的是将其粘贴在特定于表的行/行集类中,这可能有其缺点。
【问题讨论】:
-
您是否尝试使用 Zend_Db_Profiler 查看生成的请求? (见framework.zend.com/manual/en/zend.db.profiler.html)
-
@Pascal:我今天回去工作,并在 SQL 上使用了 __toString():SELECT
projects.* FROMprojectsWHERE (cid= 1) ORDER BY RAND() ,nameASC LIMIT 3 所以是的,我认为我想要的正在生成。
标签: php mysql zend-framework zend-db zend-db-table