كيف أجد أحدث طلب لكل عميل باستخدام self join؟

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

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

الإجابة

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

يجب تحديد معنى الأحدث بدقة عند تساوي التوقيت. يمكن اعتبار التوقيت الأكبر أحدث، وعند تساويه نختار المعرّف الأكبر. يفترض المثال أن created_at لا يقبل NULL، وأن id مفتاح أساسي، حتى تكون المقارنة محددة ويمكن حسم التعادل بين الطلبات.

مثال

SELECT o.id, o.customer_id
FROM orders AS o
LEFT JOIN orders AS newer
  ON newer.customer_id = o.customer_id
 AND (newer.created_at > o.created_at
      OR (newer.created_at = o.created_at AND newer.id > o.id))
WHERE newer.id IS NULL;

الأقواس تجمع حالتي التفوق ضمن شرط العميل نفسه. من دون ترتيب واضح للتعادل، قد يبقى أكثر من طلب مرشح عند مشاركة عدة طلبات أحدث توقيت.

باختصار: أحدث طلب هو الذي لا يوجد للعميل نفسه طلب يتفوق عليه وفق التوقيت ثم المعرّف.

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

اختبر فهمك

ما الشرط الذي يختار أحدث طلب لكل عميل، مع تفضيل id الأكبر عند تساوي created_at غير الفارغ؟

SELECT o.id, o.customer_id
FROM orders AS o
LEFT JOIN orders AS newer
  ON newer.customer_id = o.customer_id
 AND (newer.created_at > o.created_at
      OR (newer.created_at = o.created_at AND newer.id > o.id))
-- أضف شرط التصفية هنا