Raggruppamento
Per raggruppare in base a un determinato campo, utilizza il metodo groupBy().
$query->groupBy('uid');
Il codice sopra indicherà alla query di raggruppare per il campo uid. Nota che il nome del campo qui deve essere un alias creato dai metodi addField() o addExpression(), quindi nella maggior parte dei casi vorrai usare il valore restituito da questi metodi per assicurarti che venga usato l’alias corretto.
Per ottenere il conteggio delle righe raggruppate per un campo, ad esempio uid, puoi fare quanto segue:
$query->addExpression('count(uid)', 'uid_node_count');
Per raggruppare per più campi, basta chiamare groupBy() più volte nell’ordine desiderato.
Having
È possibile aggiungere una condizione per i valori aggregati.
$query->having('COUNT(uid) >= :matches', [':matches' => $limit]);
In questo esempio verranno trovati i casi in cui il numero di identificatori uid è maggiore o uguale a $limit. Nota che il primo parametro di having non viene filtrato prima dell’invio al database, quindi i valori forniti dall’utente devono essere passati attraverso il secondo parametro.
Esempi di groupBy e having
Il seguente codice conta il numero di nodi per UID:
$query = $connection->select('node', 'n')
->fields('n', ['uid']);
$query->addExpression('count(uid)', 'uid_node_count');
$query->groupBy("n.uid");
$query->execute();
Il blocco di codice seguente prende l’esempio precedente di conteggio dei nodi per uid e limita i risultati agli uid che hanno almeno 2 record.
$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();