【问题标题】:Zend DB Select nested JoinsZend DB 选择嵌套连接
【发布时间】:2010-10-15 21:37:34
【问题描述】:

我正在尝试使用 zend db select 实现以下查询:

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 的结构?我需要一个选择对象以在分页器中进一步处理,所以如果这不可能,我必须进行直接的 sql 查询。

【问题讨论】:

    标签: database zend-framework join nested zend-db-select


    【解决方案1】:

    我不相信您可以使用 Zend_Db_Select 进行这样的嵌套连接。最好的办法是创建自己的分页器适配器(这比您想象的要容易,请查看 Select one)并自己管理 SQL 的 LIMIT 部分。

    【讨论】:

      【解决方案2】:

      我知道这个问题已经过时了,但我认为人们仍然可以从这个问题的正确答案中受益。

      那个嵌套连接和

      一样
       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');
      

      【讨论】:

      • 这是真的,但性能通常会更差,尤其是在 MySQL 中,它对连接中的子查询处理得非常糟糕
      猜你喜欢
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多