Zend Db按自定义列表排序

时间:2012-02-16 13:42:57

标签: mysql zend-framework 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'
    ));

2 个答案:

答案 0 :(得分:2)

可以将page_type更改为ENUM(' 1',' 3',' 2',' 0') (注意顺序)。 MySQL内部将索引0链接到值1,索引1链接到值3等等。

如果您按page_type ASC订购,它将按照您通过ENUM键订购的顺序排序,而不是按每个键所涉及的实际文本排序。

根据实际链接到的page_type,您可以随时使用文字描述符,即ENUM(' news','其他内容',.....) - 您' ve没有提供有关链接的信息,因此无法就此进一步提供建议。

有关枚举的更多信息,请访问:http://dev.mysql.com/doc/refman/5.0/en/enum.html(向下滚动到段落开始的位置" ENUM值根据&#34排序; ....

唯一的缺点是,每次添加新的page_type时都需要更新表模式,但是我认为由于字段名称,这不是常见的,因此这可能是可行的选项

答案 1 :(得分:1)

您使用的是哪个版本的Zend Framework?以下用于1.1x:

$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就很有用,但正如你可能知道的那样 - 在将文字字符串插入查询时你必须非常小心。因此,如果使用此解决方案,请正确进行验证/过滤/转义。