如何返回所有行,即使联接表中没有行


How to return all rows, even if they don't have rows in a joined 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人,所以我有点难倒。

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

第二次改变

COUNT(*)

COUNT(recommendation_requests.user_id)

因为您使用的是OUTER JOIN所以每个用户的结果集中始终至少有一行,这就是为什么COUNT(*)为没有任何请求的用户提供1而不是0的原因。相反,您需要计算recommendation_requests.user_id的值。