Regroupement
Pour grouper par un champ donné, utilisez la méthode groupBy().
$query->groupBy('uid');
Le code ci-dessus indique à la requête de grouper par le champ uid. Notez que le nom du champ doit ici être un alias, créé par les méthodes addField() ou addExpression(), donc dans la plupart des cas, vous voudrez utiliser la valeur retournée par ces méthodes pour garantir que l’alias correct est utilisé.
Pour obtenir le nombre de lignes groupées par un champ, par exemple uid, vous pouvez faire ce qui suit :
$query->addExpression('count(uid)', 'uid_node_count');
Pour grouper par plusieurs champs, appelez simplement groupBy() plusieurs fois dans l’ordre souhaité.
Having
Il est possible d’ajouter une condition sur des valeurs agrégées.
$query->having('COUNT(uid) >= :matches', [':matches' => $limit]);
Dans cet exemple, seuls les cas où le nombre d’identifiants uid est supérieur ou égal à $limit seront trouvés. Notez que le premier paramètre de having n’est pas filtré avant d’être envoyé à la base de données, donc les valeurs personnalisées doivent être passées via le second paramètre.
Exemples de groupBy et having
Le code suivant compte le nombre de nœuds par UID :
$query = $connection->select('node', 'n') ->fields('n', ['uid']); $query->addExpression('count(uid)', 'uid_node_count'); $query->groupBy("n.uid"); $query->execute();
Le bloc de code suivant reprend l’exemple précédent de comptage des nœuds par uid et limite les résultats aux uids ayant au moins 2 enregistrements.
$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();