2010-10-15 59 views
0

我试图实现与Zend以下查询数据库中进行选择:嵌套的Zend DB选择加入

SELECT `uac`.`uid`, `u`.`uid`, `g`.`groupid`, `g`.`packageid` 
FROM `user_has_data` AS `uac` 
INNER JOIN `users` AS `u` ON u.uid = uac.uid 
LEFT JOIN (`user_in_group` AS `uig` 
    INNER JOIN `groups` AS `ag` ON (ag.groupid = uig.groupid) AND (ag.packageid = 2) 
) AS `g` ON uac.uid = g.uid 
WHERE (uac.dataid = '3') AND (u.uname LIKE 'test%') 
GROUP BY `u`.`uid` 

我得到了下面的,但试图转换嵌套连接到Zend的结构时卡住了:

$select = $db->select()->from(array('uac' => 'user_has_data'), array('uac.uid')) 
->join(array('u' => 'users'), 'u.uid = uac.uid', array('uid', 'uname')) 
->joinLeft(array('uig' => 'user_in_groups'), 'uig.uid = uid', array('agid' => 'uig.groupid')) 
->join(array('ag' => 'groups'), '(ag.agid = uig.groupid) AND (ag.packageid = '.$packageid.')', array('packageid')) 
->where('uac.dataid = ?', $dataid) 
->where('(u.uname LIKE ?)', $value) 
->group('u.uid'); 

是否有可能将给定的sql查询转换为适合zend db select的结构?我需要一个选择对象进一步处理paginator,所以如果这是不可能的,我必须做一个直接的SQL查询。

回答

0

我不相信你可以像Zend_Db_Select那样做一个嵌套连接。你最好的选择是创建你自己的paginator适配器(它比你想象的要容易一些,看看Select),并且自己管理SQL的LIMIT部分。

0

我知道这个问题很老,但我认为人们仍然可以从这个问题的正确答案中受益。

即嵌套连接是一样的

SELECT * FROM `user_in_group` AS `uig` 
INNER JOIN `groups` AS `ag` ON (ag.groupid = uig.groupid) AND (ag.packageid = 2) 

所以这应该只是罚款。

$subquery = $db->select() 
->from(array('uig' => 'user_in_groups'),'*') 
->joinInner(array('ag'=>'groups'),'(ag.groupid = uig.groupid) and (ag.packegeid = 2)',array('*')); 

$select = $db->select()->from(array('uac' => 'user_has_data'), array('uac.uid')) 
->join(array('u' => 'users'), 'u.uid = uac.uid', array('uid', 'uname')) 
->joinLeft('g'=>$subquery), 'uac.uid = g.uid', array('g.groupid', 'g.packageid')) 
->where('uac.dataid = ?', $dataid) 
->where('(u.uname LIKE ?)', $value) 
->group('u.uid'); 
+1

这是真的,但性能往往会更糟糕,特别是在处理联接中的子查询的MySQL非常糟糕 – limos 2013-06-27 08:53:46