如何返回所有行,即使它们在连接表中没有行

时间:2013-11-17 02:38:38

标签: php mysql database zend-framework zend-db-table

我有三个表,用户,个人资料和请求。只有已创建请求的用户才会在请求表中有一行。但是我仍然需要让所有用户都回来并显示每个用户的请求总数。我已经解决了下面的查询,它只返回在请求表中有记录的用户,虽然我需要所有用户,并且如果找不到匹配的行,则为用户请求返回0。

 public function getAllUsers()
    {
        $select = $this->userRepository->select();
        $select->setIntegrityCheck(false)
               ->from('users', array('id', 'username', 'date_created', 'active', 'last_login', 'role'))
               ->join('profiles', 'users.id = profiles.user_id', array('profile_id' => 'id', 'first_name', 'last_name', 'email', 'avatar', 'on_mailing_list'))
               ->join('recommendation_requests', 'users.id = recommendation_requests.user_id', array('requests' => 'count(*)'))
               ->order('users.date_created ASC');
        return $this->userRepository->getAdapter()->fetchAll($select);
    }

我需要更改什么才能返回所有用户,即使他们没有任何请求并且为请求列返回0,而不是请求总数。我试过joinLeft,joinRight,joinInner ....我不是一个SQL人,所以我有点难过。

1 个答案:

答案 0 :(得分:1)

首先列出所有用户使用OUTER JOIN,例如LEFT JOIN

其次更改

COUNT(*)

COUNT(recommendation_requests.user_id)

由于您使用的是OUTER JOIN,因此每个用户的结果集中至少有一行,这就是为COUNT(*)提供1代替0的原因。没有任何请求的用户。相反,您需要计算recommendation_requests.user_id的值。