2012-02-29 110 views
1

看看這段代碼:Zend框架的查詢問題

$sql = $this->getAdapter()->select() 
     ->from(array('mab' => 'module_adv_banner')) 
     ->joinLeft(array('mafb' => 'module_adv_filebanner'),'mab.id = mafb.id_banner',array('source','type')) 
     ->joinLeft(array('macb' => 'module_adv_contentbanner'),'mab.id = macb.id_banner',array('content','type')) 
     ->where('mab.id = ?', $this->_id) 
     ->order('position asc'); 

在此查詢我用3個表。首先用'mab'別名 - 是主要的橫幅表。另外兩個表格'mafb''macb'是不同橫幅類型的特定表格。如果橫幅是圖片或swf,則存儲在'mafb'表中,如果是橫幅廣告線路,我使用另一個表格 - 'macb'

在此查詢中,我選擇所有必需的橫幅元素。 兩個特定表中只有一個具有id_banner = mab.id = $this->_id,的行,並且每個表都具有字段「type」。如果它在第一個表中找到此行,則'type'的值爲空,因爲它被第二個表'type'值覆蓋。我該如何解決這個問題?

Ahmed,謝謝。

p.s. 抱歉,如果我的解釋很難,我沒有很好的英語知識。

+0

$此 - > _ ID是不是值(所以你不能 - >在哪裏( 'mab.id =?',$這 - > _ ID) ), 是嗎 ? – 2012-02-29 20:17:10

+0

不,它有價值,這是分配給$ this - > _ id在__construct() – Ahmed 2012-03-01 16:17:57

回答

1

不進入的,爲什麼你把2臺的一件事(旗)的詳細信息... 嘗試在前面加上表名到田間地頭進行選擇:

$sql = $this->getAdapter()->select() 
     ->from(array('mab' => 'module_adv_banner')) 
     ->joinLeft(array('mafb' => 'module_adv_filebanner'),'mab.id = mafb.id_banner',array('mafb.source','mafb.type')) 
     ->joinLeft(array('macb' => 'module_adv_contentbanner'),'mab.id = macb.id_banner',array('macb.content','macb.type')) 
     ->where('mab.id = ?', $this->_id) 
     ->order('position asc'); 

這會給你4場,而不是2,您可以在PHP中使用它並整理出您需要的東西。雖然有點奇怪,但是適配器沒有命名空間衝突字段名稱。

順便說一下,將array()作爲第三個參數傳遞給join()並使用columns()來定義您實際要抽出的字段有時會更方便。

0

使用$key => $value符號來創建別名:

->joinLeft(array('mafb' => 'module_adv_filebanner'),'mab.id = mafb.id_banner',array('mafb.source', 'mafb_type' => 'type')) 
->joinLeft(array('macb' => 'module_adv_contentbanner'),'mab.id = macb.id_banner',array('macb.content','macb_type' => 'type')) 
+0

我知道,我可以使用別名,但我認爲可能有解決方案與一個「類型」字段 – Ahmed 2012-03-01 16:18:49

+0

由於列組成鍵PHP數組,我不明白這是怎麼可能的,除非你想要一個'type'字段,它是兩個不是'NULL'的字段之一。如果你正在使用'IFNULL'或'COALESCE'的MySQL(現在不記得了),這是可能的。 – bububaba 2012-03-01 18:08:06