Scroll
グループ化
指定されたフィールドでグループ化するには、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の最初のパラメーターはデータベースに送信される前にフィルタリングされないため、ユーザー指定の値は2番目のパラメーターで渡す必要があることに注意してください。
groupByとhavingの例
次のコードは、UIDごとのノード数をカウントします:
$query = $connection->select('node', 'n')
->fields('n', ['uid']);
$query->addExpression('count(uid)', 'uid_node_count');
$query->groupBy("n.uid");
$query->execute();
次のコードブロックは、uidごとのノード数をカウントする前の例を使用し、少なくとも2つのレコードを持つuidsに結果を制限します。
$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();