看看这段代码:
$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'表中,如果是banner-informer,我会使用另一个表 - 'macb'
在此查询中,我选择了横幅的所有必需元素。
只有两个特定表中的一个具有id_banner = mab.id = $this->_id,
行,并且每个表都有字段'type'。如果它在第一个表中找到该行,则'type'的值为null,因为它被第二个表'type'值覆盖。我该如何解决这个问题?
最诚挚的问候,艾哈迈德。
P.S。 对不起,如果我的解释很困难,我没有很好的英语知识。
答案 0 :(得分:1)
不详细说明为什么你要为一件事保留2张桌子(横幅)...... 尝试将tablename前置到所选字段:
$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()
作为第3个参数传递给join()
并使用columns()
来定义您实际想要提取的字段有时会更方便。
答案 1 :(得分: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'))