2012-02-16 139 views
1

我想使用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

這將有可能改變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

1

您使用的是哪個版本的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每當你要插入一個文學字符串轉換爲查詢是有用的,但你可能知道 - 你必須將文學串到查詢時要非常小心。因此,如果使用此解決方案,請確認您的驗證/過濾/轉義。