Groepering
Om te groeperen op een bepaald veld gebruik je de methode groupBy().
$query->groupBy('uid');
Bovenstaande code geeft aan dat de query moet groeperen op het veld uid. Merk op dat de veldnaam hier een alias moet zijn die is aangemaakt met de methoden addField() of addExpression(). In de meeste gevallen wil je daarom de returnwaarde van die methoden gebruiken om zeker te zijn dat de juiste alias wordt gebruikt.
Om het aantal rijen te verkrijgen dat gegroepeerd is op een veld, zoals uid, kun je het volgende uitvoeren:
$query->addExpression('count(uid)', 'uid_node_count');
Om te groeperen op meerdere velden, roep je gewoon meerdere keren groupBy() aan in de gewenste volgorde.
Having
Je kunt een conditie toevoegen voor geaggregeerde waarden.
$query->having('COUNT(uid) >= :matches', [':matches' => $limit]);
In dit voorbeeld worden gevallen gevonden waarbij het aantal uid’s groter of gelijk is aan $limit. Merk op dat de eerste parameter van having() niet gefilterd wordt voordat deze naar de database wordt gestuurd, dus gebruikerswaarden moeten via de tweede parameter worden doorgegeven.
Voorbeelden van groupBy en having
De volgende code telt het aantal nodes per UID:
$query = $connection->select('node', 'n')
->fields('n', ['uid']);
$query->addExpression('count(uid)', 'uid_node_count');
$query->groupBy("n.uid");
$query->execute();
Het volgende codeblok neemt het vorige voorbeeld van het tellen van nodes per uid en beperkt de resultaten tot uids die minstens 2 records hebben:
$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();