في قواعد البيانات وعمليات استعلام البيانات، يتم استخدام كل من GROUP BY و DISTINCT للتعامل مع القيم المكررة والحصول على قيم فريده، لكن لكل منهما استخدام وغرض مختلف:
الغرض: يُستخدم DISTINCT لإزالة القيم المكررة من نتائج الاستعلام. فهو يعمل على إرجاع كل سجل فريد في العمود أو الأعمدة المحددة.
الاستخدام: يستخدم DISTINCT عندما تريد فقط الحصول على قائمة بالقيم الفريدة ولا تحتاج إلى أي عمليات تجميع أو تلخيص للبيانات.
مثال: إذا كنت ترغب في معرفة كافة البلدان الممثلة في قاعدة بيانات العملاء، يمكنك استخدام
مثال : اذا كان لدينا جدول countries(الدول) - وجدول customers ( المستخدمين )، بالطبع سيكون لدينا مستخدمين يتبعون لأكثر من دوله، ونريد الحصول على قائمة الدول التي يوجد لها مستخدمين لكن دون تكرار لإسم الدوله.
SELECT DISTINCT country FROM customers;
بذلك نحصل على قائمه بالدول دون تكرار الدوله.
الغرض: يُستخدم GROUP BY لتجميع الصفوف التي تحتوي على نفس القيم في العمود أو الأعمدة المحددة. هذا مفيد بشكل خاص عندما ترغب في تنفيذ بعض الدوال الإحصائية أو الإجمالية، مثل COUNT, SUM, AVG, إلخ.
الاستخدام: يستخدم GROUP BY عندما تحتاج إلى تجميع البيانات وتلخيصها بطريقة معينة. يُمكنك من تحديد كيفية تجميع السجلات وتطبيق دوال إجمالية على كل مجموعة.
بإختصار
GROUP BY يمكن أن يكون بديلاً لـ DISTINCT في بعض السيناريوهات.
لتحديد عدد العملاء في كل بلد:
SELECT country, COUNT(*) FROM customers GROUP BY country;
هذا الاستعلام يستخدم GROUP BY لتجميع العملاء بناءً على الدولة ويستخدم الدالة الإجمالية COUNT(*) لحساب عدد العملاء في كل دولة. هذا مثال ممتاز على كيفية استخدام GROUP BY لإجراء حسابات تجميعية.
للحصول على قائمة فريدة من الدول:
SELECT country FROM customers GROUP BY country;
هذا الاستعلام يستخدم GROUP BY لتجميع السجلات بناءً على الدولة، وهو يعطي نفس النتيجة التي يعطيها استخدام DISTINCT، ولكن بدون تحديد تلك الكلمة صراحةً. هذه الطريقة تعمل جيداً في الحصول على قيم فريدة، ولكن يُفضل استخدام DISTINCT عندما لا تحتاج إلى حسابات تجميعية لأنه قد يكون أكثر وضوحًا من حيث النية في الكود.
كلا الاستعمالين صحيحان ويظهران بشكل جيد كيفية الاستفادة من GROUP BY في سياقات مختلفة. GROUP BY يعطي مرونة أكبر في حالة إجراء حسابات تجميعية، بينما DISTINCT يُستخدم عادة للبساطة عندما تريد فقط الحصول على قائمة فريدة دون تكرار.
لفرض لدينا قاعده البيانات التالية
public function index() { $orders = Order::query() ->select('user_id') ->with('user:name,id') ->groupBy('user_id') ->get(); return view('groub_by', compact('orders')); }
وفي blade
<table class="table table-striped table-bordered"> <thead> <th>Name</th> </thead> <tbody> @foreach($orders as $order) <tr> <td>{{ $order->user->name }}</td> </tr> @endforeach </tbody> </table>
سيؤدي الكود أعلاه إلى ظهور صوف فريده لكل مستخدم قام بأي عملية شراء
public function index() { $orders = Order::query() ->distinct('user_id') ->select('user_id') ->with('user:name,id') ->get(); return view('groub_by', compact('orders')); }