كيف أعد الطلبات مع إظهار العملاء بلا طلبات؟

متقدمقراءة دقيقةآخر تحديث 2 أكتوبر 2026

SQL قواعد البيانات

الإجابة

عند إعداد تقرير يشمل العملاء دون طلبات، يمكن البدء بجدول العملاء وربطه بالطلبات باستخدام LEFT JOIN. يبقى لكل عميل صف في ناتج الربط حتى إذا لم يجد طلبا مطابقا. لكن هذا الصف يحتوي على قيم مفقودة في أعمدة الطلب، وهو ما يؤثر في اختيار تعبير العد الصحيح.

مثال

SELECT c.id, COUNT(o.id) AS order_count
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.id
GROUP BY c.id;

إذا كان o.id مفتاحا أساسيا، فإن كل طلب حقيقي يملك قيمة معروفة فيه. لذلك يعده COUNT(o.id)، بينما يتجاهل الصف الذي أنشأه الربط لعميل بلا طلبات. النتيجة المطلوبة لذلك العميل هي صفر.

أما COUNT(*) فيعد صف الربط نفسه، وقد يعطي واحدا للعميل الذي لا يملك أي طلب. هذه ليست مشكلة في الدالة، بل نتيجة اختلاف الشيء الذي نعده: صفوف الربط مقابل سجلات الطلبات الحقيقية.

باختصار: بعد الربط الخارجي، عد مفتاح الجدول التابع غير القابل للفقد للحصول على عدد السجلات المطابقة.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

ما قيمتا joined_rows وorder_count للعميل 2؟

CREATE TABLE customers (id INT PRIMARY KEY);
CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT NOT NULL
);
INSERT INTO customers VALUES (1), (2);
INSERT INTO orders VALUES (10, 1), (11, 1);
SELECT c.id, COUNT(*) AS joined_rows,
       COUNT(o.id) AS order_count
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.id
GROUP BY c.id
ORDER BY c.id;