كيفية استثناء الحقوق لشارة مخصصة إذا تم منح مستوى أعلى بالفعل؟ الهدف هو منح أعلى مستوى فقط مؤهل له مستخدم معين…
لنفترض أن لدي 3 شارات:
المستوى 1: 5 إعجابات تم تقديمها، 5 تم استلامها
المستوى 2: 100 إعجاب تم تقديمها، 100 تم استلامها
المستوى 3: 250 إعجاب تم تقديمها، 250 تم استلامها
الكود أدناه للمستوى 2. المستويات الأخرى ليس بها أي اختلاف بخلاف الرقم ‘100’
SELECT us.user_id, current_timestamp AS granted_at
FROM user_stats AS us
WHERE us.likes_received >= 100
AND us.likes_given >= 100
AND (:backfill OR us.user_id IN (:user_ids))
هل هذا يحتاج أيضًا إلى سطر إضافي في قاعدة بيانات شارات SQL لموازنته؟ شيء مثل:
SELECT us.user_id, current_timestamp AS granted_at
FROM user_stats AS us
WHERE us.likes_received >= 100
AND us.likes_given >= 100
AND us.likes_given < 250
AND (:backfill OR us.user_id IN (:user_ids))
(ربما استخدام BETWEEN أو ما شابه، على الرغم من أنني لم أختبر ذلك بعد )
وبعد ذلك، عندما يتم تشغيل الاستعلام، سيمنح الشارة لـ 100 إعجاب في المرة الأولى، ويتجاهلها من 101 إلى 249، ثم يلغيها عند 250 (حيث ستستلم الشارة التالية من).
تحديث: لقد تدربت قليلاً على BETWEEN، ويبدو أن شيئًا مثل هذا يلتقط جميع الأشخاص المناسبين في الاختبار التجريبي:
SELECT us.user_id
FROM user_stats AS us
WHERE us.likes_received BETWEEN 100 AND 249
ORDER BY us.likes_received DESC
لذا، يجب أن يعمل شيء مثل هذا إذا تم تحويله إلى شارة مشغلة:
SELECT us.user_id, current_timestamp AS granted_at
FROM user_stats AS us
WHERE us.likes_received BETWEEN 100 AND 249
AND us.likes_given BETWEEN 100 AND 249
AND (:backfill OR us.user_id IN (:user_ids))
هذا مثالي تقريبًا. قد يحدث حدث نادر: يقوم المستخدم بتسليم الكثير في “المعطى” بينما يتأخر في “المستلم” (أو العكس)، لذلك يمكن فقدان الشارة قبل منح الشارة التالية (روتين الإلغاء).
بحثت واكتشفت خاصية مثيرة للاهتمام: something.badge_id = 123 حيث “something” هو المتغير المعرف من قبل المستخدم و “123” هو معرف شارة أخرى. سأجرب وأكمل استعلامات SQL الأصلية للمستوى 1 والمستوى 2 بفحوصات استبعاد ضد شارات المستوى الأعلى.