Zend Db按自定义列表排序

问题描述:

我想使用Zend Db对自定义列表中的某些数据库行进行排序。Zend Db按自定义列表排序

它们具有字段PAGE_TYPE,其可以是0,1,2或3,我想他们顺序如下:1,3,2,0

我已经发现,有可能用MySQL

SELECT id 
FROM table 
WHERE id IN (15,21,4,8) 
ORDER BY id = 15 DESC, id = 21 DESC, id = 4 DESC, id = 8 DESC 

与Zend DB是它也有可能或者我应该只使用普通的MySQL这里?

这是我的代码现在:

$select = $this->select() 
    ->order(array(
     'asc' => 'page_type' 
    )); 

这将有可能改变PAGE_TYPE是ENUM( '1', '3', '2', '0')(注意顺序)。 MySQL内部将索引0链接到值1,索引1链接到值3等。

如果您然后通过page_type ASC进行订购,它将按您希望的顺序排序,因为它按ENUM键顺序排列而不是每个键所涉及的实际文本。

取决于page_type实际链接到的是什么,您可以始终使用文本描述符,即ENUM('news','something else',.....) - 您没有提供关于哪些链接不能提供的信息就此提出进一步的建议。

上枚举

的更多信息可以在这里找到:http://dev.mysql.com/doc/refman/5.0/en/enum.html(向下滚动的段落开始的地方“ENUM值根据分类” ......

唯一的缺点是,你将需要更新表格模式,每次你添加一个新的page_type,但我会假设由于字段名称这不会是一个普遍的发生,所以这可能是一个可行的选择

+0

我喜欢简单的解决方案,谢谢 – Thomas 2012-02-16 15:21:29

您使用的是哪个版本的Zend Framework?在1.1倍的工作:

$select->order(array(
    new Zend_Db_Expr("page_type = 1 DESC"), 
    new Zend_Db_Expr("page_type = 3 DESC"), 
    new Zend_Db_Expr("page_type = 2 DESC"), 
    new Zend_Db_Expr("page_type = 0 DESC") 
)); 

$select->order(array(
    new Zend_Db_Expr("page_type = 1 DESC, page_type = 3 DESC, page_type = 2 DESC, page_type = 0 DESC") 
)); 

Zend_Db_Expr每当你要插入一个文学字符串转换为查询是有用的,但你可能知道 - 你必须将文学串到查询时要非常小心。因此,如果使用此解决方案,请确认您的验证/过滤/转义。