لدي بعض أكواد SQL الخاصة بالشارات التي تمنح شارة بناءً على عدد المواضيع الجديدة التي تم إنشاؤها في فئة معينة والتي تحتوي أيضًا على عبارة معينة (عنوان URL محدد) في المنشور الأول للموضوع.
إنها تعمل، ولكن ليس تمامًا كما هو مقصود:
SELECT badge_posts.user_id, min(badge_posts.created_at) granted_at, MIN(badge_posts.id) AS post_id
FROM badge_posts
JOIN topics ON topics.id = badge_posts.topic_id
WHERE category_id = 17
AND badge_posts.post_number = 1
AND badge_posts.raw LIKE '%dronescene.co.uk%'
GROUP BY badge_posts.user_id
HAVING COUNT(*) > 49
ORDER BY post_id DESC
لدي أربع شارات متاحة، برونزية وفضية وذهبية وبلاتينية، وأستخدم أشياء مثل HAVING count(*) > 1 للشارة البرونزية و HAVING count(*) > 10 للشارة الفضية، إلخ. يتم إصدار جميع الشارات تلقائيًا، ولا توجد مشاكل في ذلك.
المشكلة التي يبدو أنني أواجهها هي أن جميع الشارات يتم إصدارها للموضوع الأول في تلك الفئة، بدلاً من أحدث معرف موضوع يتطابق مع عبارة WHERE.
على سبيل المثال، لدي عضو لديه ثلاث شارات، وجميع الشارات الثلاث تم إصدارها مقابل نفس الموضوع الأول الذي أنشأه والذي يتطابق مع عبارة WHERE الخاصة بي، بدلاً من أحدث معرف موضوع يتطابق مع عبارة WHERE.
هل يمكن لأحد أن يخبرني بما أفعله بشكل خاطئ مع عبارة ORDER BY الخاصة بي؟
إذا قمت بتبديل MIN بـ MAX، فسأحصل بعد ذلك على معرف الموضوع الأحدث (شكرًا @JammyDodger ) ولكن الآن بعد أن نظرت في بعض تغييرات المعاينة، أعتقد أن منطقي هنا معيب بشكل أساسي على أي حال
باستخدام MAX، أرى بعد ذلك أن جميع الشارات الأخرى في هذه المجموعة تُمنح لمعرف الموضوع الأحدث بدلاً من ذلك.
إنها نفس المشكلة، فقط بالعكس.
D’oh
كان منطقي ببساطة:
المشكلة هنا هي أنه إذا حصل شخص ما على شارة برونزية في يناير، وفضية في مارس، وذهبية في يونيو، فسيتم منح الشارات الثلاث جميعها لمعرف الموضوع الأول الخاص به في يناير
أعتقد أن هذا يرجع إلى أنك تقوم بتشغيله على أشخاص مؤهلين بالفعل للأربعة جميعًا. إذا تم تقديمه “حديثًا” ، فأعتقد أنه سيتم منحه تلقائيًا في أحدث تاريخ للموضوع بمجرد أن يتجاوز المستخدم الحد الأدنى.
بالنسبة لتشغيل “قديم” ، قد تحتاج إلى إضافة حد؟
تعديل: إعادة أول 25 سجلًا مؤهلًا (على سبيل المثال) لكل مستخدم في استعلام واحد يتجاوز مهاراتي الحالية.
ومع ذلك ، اعتمادًا على عدد المستخدمين المؤهلين للحصول على شارات متعددة ، يمكنك منح الشارات القديمة يدويًا باستخدام معلومات من استعلام مستكشف البيانات؟ ثم يجب أن يمنح تشغيل الاستعلام التلقائي للشارات أعلاه الشارة الصحيحة للمنشور الصحيح بعد منحها.
شيء مثل:
-- [params]
-- int :user_id = 1
-- int :limit = 50
SELECT bp.user_id, bp.created_at, bp.id as post_id
FROM badge_posts bp
JOIN topics t ON t.id = bp.topic_id
WHERE bp.user_id = :user_id
AND t.category_id = 17
AND bp.post_number = 1
AND bp.raw LIKE '%dronescene.co.uk%'
ORDER BY bp.created_at ASC
LIMIT :limit
أعتذر عن أي أخطاء إملائية.
(يجب أن تكون البرونزية قابلة للتحقيق باستخدام إصدار MIN ، والبلاتينية باستخدام MAX ، لذا فهي فقط 10 و 25)