2

原始问题:

我目前正在使用 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 包含可以像任何其他数据库查询一样迭代的标准行集,它唯一不做的是将其粘贴在特定于表的行/行集类中,这可能有其缺点。

4

4 回答 4

4

您的初始解决方案不正确,因为此查询将为每一行生成一个随机值并根据它对行进行排序,仅当随机值相等时才按名称排序(这是极不可能的)。

该问题可以通过如下子查询来解决

select * from (select * from categories order by rand() limit 3) c order by name

我将把它翻译成 Zend_Db 语言的任务留给你。

于 2009-07-17T19:59:17.700 回答
1
$subQuery = $this->select()->from('picture')->order(new Zend_Db_Expr('RAND()'))->limit(count($this->selectAll()));
$select->setIntegrityCheck(false)
       ->from($subQuery);

这就是我所做的并且有效。干杯!

于 2011-12-21T15:37:43.720 回答
0

尝试这个:

$select = $this->select();
$select->order('RAND(), name');
$select->limit(3);
return $this->fetchAll($select);

这对我有用,所以它也应该对你有用。

于 2009-07-18T12:45:15.337 回答
0

为什么不创建一个按名称对数据进行排序的行集子类函数呢?

于 2009-07-18T09:51:23.397 回答