2012-02-29 101 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