我有一个用户表:
+------+------+
| id | name |
+------+------+
| 1 | A |
+------+------+
| 2 | B |
+------+------+
| 3 | C |
+------+------+
| 4 | D |
+------+------+
关系表users_group:
+------+----------+
|user_id|group_id |
+------+----------+
| 1 | 1 |
+------+----------+
| 1 | 2 |
+------+----------+
| 3 | 3 |
+------+----------+
| 4 | 4 |
+ ------ + ---------- +
我的应用程序中有一个显示用户数据的显示:
------- --------- ----------------
user id user name number of groups
------- --------- ----------------
在我的Zf2中,我在mapper中运行查询以获取用户数据:
public function fetchAllUsers()
{
$select = $this->getSelect();
$select->from('user');
->join('users_group', 'user.id=users_group.user_id', array(), 'left');
$users = $this->select($select)->getDataSource();
return $users;
}
我需要的是,如何在同一个查询中获取每个用户所属的组数,并将其返回到相同的数组中以在应用程序中获取并提供表格显示?
答案 0 :(得分:1)
在常规SQL中,您可以使用LEFT JOIN
将users表加入users_group表,并使用COUNT
来计算生成的组;
SELECT u.id, u.name, COUNT(ug.group_id) num_groups
FROM users u
LEFT JOIN users_group ug
ON u.id = ug.user_id
GROUP BY u.id, u.name
ORDER BY u.id
在ZF2中,它应该类似于(未经测试的);
use Zend\Db\Sql\Expression;
public function fetchAllUsers()
{
$select = $this->getSelect();
$select->columns(array('user.id', 'user.name',
'num_groups' => new Expression('COUNT(users_group.group_id)')));
$select->from('user');
$select->join('users_group', 'user.id=users_group.user_id', array(), 'left');
$select->group(array('user.id', 'user.name'));
$users = $this->select($select)->getDataSource();
return $users;
}