我有三个表,用户,个人资料和请求。只有已创建请求的用户才会在请求表中有一行。但是我仍然需要让所有用户都回来并显示每个用户的请求总数。我已经解决了下面的查询,它只返回在请求表中有记录的用户,虽然我需要所有用户,并且如果找不到匹配的行,则为用户请求返回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人,所以我有点难过。
答案 0 :(得分:1)
首先列出所有用户使用OUTER JOIN
,例如LEFT JOIN
其次更改
COUNT(*)
到
COUNT(recommendation_requests.user_id)
由于您使用的是OUTER JOIN
,因此每个用户的结果集中至少有一行,这就是为COUNT(*)
提供1
代替0
的原因。没有任何请求的用户。相反,您需要计算recommendation_requests.user_id
的值。