समूहीकरण (Grouping)
किसी दिए गए फ़ील्ड पर ग्रुप करने के लिए groupBy() मेथड का उपयोग करें।
$query->groupBy('uid');
ऊपर दिया गया कोड क्वेरी को uid फ़ील्ड पर ग्रुप करने का निर्देश देगा। ध्यान दें कि यहाँ फ़ील्ड का नाम वही उपनाम (alias) होना चाहिए जो 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();
निम्न कोड ब्लॉक पिछले उदाहरण को लेता है और परिणामों को केवल उन्हीं UIDs तक सीमित करता है जिनमें कम से कम 2 रिकॉर्ड्स हैं:
$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();