>我有三个表,用户,配置文件和请求。只有已创建请求的用户才会在请求表中显示一行。但我仍然需要让所有用户恢复并显示每个用户的请求总数。我已经解决了下面的查询,它只返回在请求表中有记录的用户,尽管我需要所有用户,并且如果找不到匹配的行,它为用户请求返回 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
的值。