2011-09-16 58 views
2

我試圖找到如何翻譯下面的MySQL查詢到Zend數據庫表中選擇:使用FORCE INDEX與Zend

SELECT ColA,ColB,ColC 
FROM MyTable 
FORCE INDEX(ColA,ColB) 
WHERE ColA = 'val0002' 
AND ColB = 'val0045' 

我嘗試使用這樣的:

$select = $dbTable->select() 
      ->from('MyTable',array('ColA','ColB') 
      ->forceIndex(array('ColA','ColB')) 
      ->where("ColA = 'val0002'") 
      ->where("ColB = 'val0045'"); 

我發現「 forceIndex(陣列( '可口可樂', 'COLB'))「的論壇,但它不工作:(

,並感謝您對我的幫助:)

回答

4

我認爲Zend_Db_Select還不支持。這裏似乎有一個改進要求:http://framework.zend.com/issues/browse/ZF-7570

(報告中的註釋包含一些可能對您有用的代碼的鏈接)。這裏

希望幫助,

+0

這個方法MySQL太糟糕了,在Zend中並不等價,它大大提高了查詢的性能。等待在下一個Zend版本中找到解決方案。 – Salem

1

是一個解決方案,能夠幫助感興趣的問題:
http://pastie.org/1354770

,我們可以在以下兩種方法增加了Zend類「Zend_Db的」。我希望它能幫助你,因爲它幫助了我(但部分)。

/** 
* Specify index to use 
* 
* @return Zend_Db_Select 
*/ 
public function useIndex($index) 
{ 
    if(empty($this->_parts[self::FORCE_INDEX])) { 
     if(!is_array($index)) { 
      $index = array($index); 
     } 
     $this->_parts[self::USE_INDEX] = $index; 
     return $this; 
    } else { 
     throw new Zend_Db_Select_Exception("Cannot use 'USE INDEX' in the same query as 'FORCE INDEX'"); 
    } 
} 

/** 
* Force index to use 
* 
* @return Zend_Db_Select 
*/ 
public function forceIndex($index) 
{ 
    if(empty($this->_parts[self::USE_INDEX])) { 
     if(!is_array($index)) { 
      $index = array($index); 
     } 
     $this->_parts[self::FORCE_INDEX] = $index; 
     return $this; 
    } else { 
     throw new Zend_Db_Select_Exception("Cannot use 'FORCE INDEX' in the same query as 'USE INDEX'"); 
    } 
}