滚动
分组
要按指定字段进行分组,请使用 groupBy() 方法。
$query->groupBy('uid');
上面的代码会指示查询按 uid 字段进行分组。请注意,这里的字段名必须是通过 addField() 或 addExpression() 方法创建的别名,因此在大多数情况下,你需要使用这些方法的返回值,以确保使用的是正确的别名。
如果你想获取按某个字段(例如 uid)分组的行数,可以这样做:
$query->addExpression('count(uid)', 'uid_node_count');
要按多个字段分组,只需多次调用 groupBy(),按照所需顺序即可。
Having
可以为聚合值添加条件。
$query->having('COUNT(uid) >= :matches', [':matches' => $limit]);
在这个示例中,会找到 uid 数量大于或等于 $limit 的情况。请注意,having 的第一个参数在传入数据库之前不会被过滤,因此用户输入的值必须通过第二个参数传递。
groupBy 和 having 示例
以下代码统计了每个 UID 的节点数量:
$query = $connection->select('node', 'n')
->fields('n', ['uid']);
$query->addExpression('count(uid)', 'uid_node_count');
$query->groupBy("n.uid");
$query->execute();
下面的代码基于前一个示例,限制结果只返回至少有 2 条记录的 uid:
$query = $connection->select('node', 'n')
->fields('n',['uid']);
$query->addExpression('count(uid)', 'uid_node_count');
$query->groupBy("n.uid");
$query->having('COUNT(uid) >= :matches', [':matches' => 2]);
$results = $query->execute();