如何在ZF2中获取SQL查询中出现的次数

时间:2014-08-21 18:32:33

标签: mysql sql zend-framework2

我有一个用户表:

+------+------+
| 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;
}

我需要的是,如何在同一个查询中获取每个用户所属的组数,并将其返回到相同的数组中以在应用程序中获取并提供表格显示?

1 个答案:

答案 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

An SQLfiddle to test with

在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;
}