MySQL随机行按列名排序

时间:2009-07-17 18:58:21

标签: php mysql zend-framework zend-db zend-db-table

原始问题:

我目前正在使用带有Zend_Db_*的Zend Framework,我从表中选择了三个随机行:

$category->getTable()->select()->order(new Zend_Db_Expr('RAND()'))->limit('3')

$categoryZend_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>

4 个答案:

答案 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);

这对我有用,所以它也适合你。