لقد أنشأنا شارة برونزية، مستخدمون يساعدون مستخدمين، للأشخاص الذين يحاولون مساعدة المستخدمين الآخرين. يتم منحها يدويًا (لتحديد الفرق بين محاولات المساعدة و “أنا أيضًا”).
لكل 5 شارات برونزية، نريد منح شارة فضية، لا تقدر بثمن.
يحدد استعلام SQL الذي توصلت إليه المستخدمين الصحيحين، ولكن مرة واحدة لكل منهما فقط:
SELECT user_id, current_timestamp AS granted_at
FROM user_badges
WHERE badge_id = 110 -- مستخدمون يساعدون مستخدمين
AND (:backfill OR user_id IN (:user_ids))
GROUP BY user_id
HAVING COUNT(*) >= 5
هل فاتني بعض السحر في استعلام SQL الخاص بي، أم أن المضاعف يحدث خارج استعلام SQL؟
أيضًا، ليس من الواضح لي كيف تحدث العملية الحسابية بحيث لا يحصل مستخدمي على شارات جديدة كل يوم (سيتم تشغيل هذا عند تشغيل ليلي) حتى لو لم يحصلوا على 5 شارات برونزية جديدة.
حسنًا، أدت عمليات بحث أعمق إلى اكتشاف دليل قادني إلى الدليل
لا يزال موضوع الملء الاحتياطي غامضًا بعض الشيء، لكنني قررت (بالطبع!) تجربة هذا على نسختنا التجريبية. أفترض أن الملء الاحتياطي يعمل ليلاً، لذلك سأعرف المزيد غدًا.
أفكر مبدئيًا في استخدام RANK ولكني قد أكون متمسكًا بالقش…
نموذج أولي تقريبي...
WITH badge_count AS (
SELECT
user_id,
granted_at,
RANK() OVER (PARTITION BY user_id ORDER BY granted_at ASC) AS rank
FROM user_badges
WHERE badge_id = 110
)
SELECT user_id, granted_at
FROM badge_count
WHERE rank IN (5,10,15,20,25,30,35,40,45,50)
حسنًا، محاولة ثانية باستخدام ROW_NUMBER بدلاً من ذلك:
WITH badge_count AS (
SELECT
user_id,
granted_at,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY granted_at ASC) AS row
FROM user_badges
WHERE badge_id = 110
)
SELECT user_id, granted_at
FROM badge_count
WHERE row % 5 = 0
على الرغم من ذلك، عند إجراء المزيد من الاختبارات، يعمل هذا بشكل صحيح في المعاينة ولكنه لا يُمنح عدة مرات عند تشغيل مهمة badge grant الفعلية. لست متأكدًا حقًا من السبب.
لقد أربكت نفسي. سأشرب كوبًا من الشاي وأعيد التجمع.
حسنًا… لقد أعطيت المستخدم الخاص بي 4 برونزيات أخرى أمس لأرى ما إذا كان التشغيل الليلي سيضيف على الأقل الشارة الجديدة التي “اكتسبها” للتو. (اعتقدت أنه إذا كان عليّ اللحاق بالبقية يدويًا، فيمكنني ذلك.) لكن حتى ذلك لم ينجح.
لقد قمت بإعداد واحد آخر مطابق تقريبًا لاختباره بناءً على شارة “كل 5 مشاركات في موضوع معين” باستخدام مشغل “عندما ينشئ مستخدم أو يعدل منشورًا” - وهذا يعمل بشكل مثالي. أنا أتحرى عن سبب الاختلاف المحتمل…
إليك استعلام SQL لشارة الاختبار هذه للمقارنة إذا تمكن أي شخص من ملاحظة أي شيء:
WITH post_count AS (
SELECT
user_id,
id,
created_at,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at ASC) AS row
FROM posts
WHERE topic_id = 864
)
SELECT user_id, created_at granted_at, id post_id
FROM post_count
WHERE row % 5 = 0
AND (:backfill OR id IN (:post_ids))
بعد القليل من الاستكشاف والتشاور، يبدو أن مانح الشارات التلقائي سيمنح شارات متعددة فقط إذا كانت تستند إلى مشاركات محددة. لذلك، هذه الأنواع ستمنح الشارة الأولى فقط (المعاينة مضللة ).
أعتقد أنه في حالات مماثلة، يمكن أن تعمل الشارات “المتصاعدة” بشكل جيد (مثل شارات تم الحل). لذا، فضية لـ 30 وذهبية لـ 100، على سبيل المثال، إذا كان هذا يمكن أن يكون بديلاً قابلاً للتطبيق؟
إذًا… على الرغم من أن الشارات البرونزية تُمنح بناءً على المشاركات… فهذا لا يُحتسب، أليس كذلك؟
لا أعرف. لا أعتقد أنني أفهم السؤال. :ضحك:
أعتقد أن الاقتراح ليس العثور على 5 شارات، بل 5 مشاركات تم فيها منح شارة؟ يمكنني فعل ذلك. لقد فعلت ذلك بالفعل تقريبًا في تقريري “العثور على مشاركات جديدة لمنح شارات لها”.
WITH badge_count AS (
SELECT
user_id,
granted_at,
post_id,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY granted_at DESC) AS row
FROM user_badges
WHERE badge_id = 110
AND post_id IS NOT NULL
)
SELECT user_id, granted_at, post_id
FROM badge_count
WHERE row % 5 = 0
AND (:backfill OR post_id IN (:post_ids))
(إضافة AND post_id IS NOT NULL يحميها من إذا مُنح شخص ما واحدة بدون سبب، وإلا فإنها ستتعطل)
الدفعة الخلفية هي المهمة اليومية. المشغل ‘تحديث يومي’ هو في الأساس ذلك، في حين أن المشغلات الأخرى هي ‘في الوقت المناسب’ (على سبيل المثال، إذا كانت الشارة تستخدم ‘عندما ينشئ مستخدم أو يحرر منشورًا’ فلن تحتاج إلى الانتظار طوال الليل للحصول عليها).\n\nهل يمكنك إرفاق لقطة شاشة لشارتك حتى أتمكن من رؤية ما قد يكون مختلفًا؟\n\n
لقد افترضت أن المهمة تعمل في الساعات الأولى من صباح (صباحي).
في الواقع، كنت قد منحت هذا المستخدم شارات في الأصل دون أسباب، لذلك بالأمس قمت بإلغاء جميعها، وحفرت المنشورات منه وأعدت المنح. تم تشغيل المهمة في منتصف عملية المنح الخاصة بي.
هذا على موقع الاختبار الخاص بي، بالمناسبة.
أفترض أن الشارة الثانية سيتم منحها في غضون ساعات قليلة، لكنني أود أن أرى شارات متعددة تُمنح في وقت واحد. هل سيحدث ذلك إذا قمت بإلغاء الفضية؟ هل سيتم منحه شارتين فضيتين جديدتين في… ساعتين؟