2014-04-11 69 views
0

我搜索很多,但沒有得到任何幫助與隨機記錄mysql.I使用隨機查詢從數據庫中獲取隨機數據與一些限制不在。如果數據庫包含100條記錄,並假設我給30作爲隨機函數的限制,有些不在id中。我的問題是,當它第一次觸及時,我不在id中給出空白,它隨機給我30條記錄。但是,對於第二次除了最後30條記錄(即不在變量中)之外,它應該給我70條記錄中的另外30條記錄,但它給我的不到30條即(28,29)。這是因爲它首先應用隨機函數和限制,然後用不in.My查詢過濾它是象下面這樣:隨機查詢Zend

$subQuery = $this->select() 

->from(array('s' => 'shop'), array('s.shop_id','b.shop_name','b.shop_template_id')) 
->order('RAND()') 
->where('s.shop_id NOT in (?)', $shop_id) 
->limit(30); 

$query = $this->select() 

->from(array('b' => $subQuery), array('*')) 
->join(array('p' => 'product'), 's.shop_id = p.shop_id', array('p.product_price')) 
->setIntegrityCheck(false); 
$resultRows = $this->fetchAll($query); 

更新:我爲什麼它是爲有問題的(28,29)記錄的某個時候,因爲連接查詢包含產品的店,如果一些商店正在0產品它沒有得到那shop.My問題是,不管產品怎麼能從數據庫得到那家商店。

回答

0

你的問題是你加入而不是左連接。也不需要子選擇。這應該工作:

$objSelect = $this->select()->setIntegrityCheck(false); 
$objSelect->from(
    array('s' => 'shop'), 
    array('s.shop_id','b.shop_name','b.shop_template_id') 
); 
$objSelect->joinLeft(
    array('p' => 'product'), 
    's.shop_id = p.shop_id', 
    array('p.product_price') 
); 
$objSelect->order('RAND()'); 
$objSelect->limit(30); 
$objRowSet = $this->fetchAll($objSelect); 
+0

謝謝您的回答一兩件事,我們希望它應該取店隨機它幹嘛,但默認情況下它適用asc.We不想任何ASC和DESC條件應該得到整個數據庫隨機店我們嘗試 - > order('RAND()') - > order('shop_name DESC') - > order('shop_id DESC')仍然沒有給出隨機data.any建議。 – user3406754

+0

不確定你在這裏的意思,對不起。如果您使用rand()命令,則記錄將以隨機順序返回。如果您添加另一個訂單,則不會讓它們隨機化 - 在這種情況下,您必須將第一個(隨機)查詢包裝在子查詢中,並對該選擇應用另一個訂單。但你似乎要求隨機訂購,你應該從使用上面的代碼中獲得。 RAND()函數上面的 – Bing

+0

默認情況下會按照升序排列隨機記錄,我們不需要它,它應該從任何順序中選擇隨機數據,而不是升序或降序。 – user3406754