2010-03-24 35 views
2

這可能是一件非常簡單的事情。看看下面Zend Framework - 在嵌套查詢上應用排序

 
(select * from shopping order by shopping_id desc limit 5) order by RAND() 

這個查詢成功運行在MySQL中正常的SQL查詢 - 不知道這是做的正確的方式 - 但它的作品。它從購物表中獲得最後5個ID,並隨時隨機訂購它們

我想在Zend中實現這一點。我不知道如何執行第一部分,然後將RAND子句應用於結果 - 我下面的內容沒有這樣做。

 
$select = $this->select()  
      ->from(array('sh'=>'shopping')) 
      ->order('shopping_id desc') 
      ->limit(5)  
      ->order('RAND()'); 
+0

我很確定原生Zend_Db不會進行子查詢。您可以輕鬆地通過RAND()命令離開,然後讓您的Rowset/PHP代碼隨機化5個條目... – gnarf 2010-03-24 16:47:18

+0

@gnarf Zend_Db_Select可以做很多子選擇。你只需要將它們放入Zend_Db_Expr的查詢中即可。 – Gordon 2010-03-24 17:12:17

+0

我會按照@ gnarf的建議考慮「ORDER BY RAND()」會繞過查詢緩存。 – leek 2010-03-24 18:51:04

回答

2

爲什麼不採取稍微不同的方法,將獲得相同的結果。如果刪除子查詢和order by RAND(),則可以非常快速地從數據庫中獲取行,然後在處理這些行時,可以隨時對它們進行隨機化。

$select = $this->select()  
     ->from(array('sh'=>'shopping')) 
     ->order('shopping_id desc') 
     ->limit(5)  

$rows = $this->fetchAll($select); 

// take it from a rowset object, convert to an array: 
$rowArray = array(); 
foreach ($rows as $row) $rowArray[] = $row; 
shuffle($rowArray); 
+0

@Gublooo - 在這裏,我的評論版本值得作爲回答:) – gnarf 2010-03-24 20:35:14

1

Zend_Db_Expr類讓你這樣做。你創建一個Zend_Db_Expr類的新實例,並使用它的構造函數作爲字符串傳入表達式:「RANDOM()」。

$選擇= $這 - >選擇()
- >從(陣列( 'SH'=> '購物')) - >順序( 'shopping_id降序') - >限(5)
- > order(new Zend_Db_Expr('RANDOM()'));