شارات لعدد المواضيع المثبتة / شارة SQL؟

مجتمعنا يركز على المواضيع المثبتة والمثبتة عالميًا. للأسف، لا يوجد عداد للإحصائيات لهذا الغرض في صفحات ملفات المستخدمين على الإطلاق، ويبدو أن المواضيع المثبتة أو المثبتة عالميًا لا تُخزَّن بطريقة منهجية في أي مكان في قاعدة البيانات.

في ضوء ذلك، أبحث عن طريقة لمنحشارات على الأقل مثل: أول موضوع مثبت، 10 مواضيع مثبتة، 100 موضوع مثبت، بالإضافة إلى المواضيع المثبتة عالميًا.

هل يمكن لأي شخص مساعدتي في كتابة استعلام SQL للشارات من هذا النوع؟

نقطة البداية لدي هي:

SELECT p.user_id, min(p.created_at) granted_at, MIN(p.id) post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
WHERE t.unpinned IS NOT NULL
GROUP BY p.user_id
HAVING count(*) > 5

ولكن هذا يعطيني الخطأ:

ERROR: column t.unpinned does not exist
LINE 6: WHERE t.unpinned IS NOT NULL

أعتقد أنني مضطر للتعامل مع حقل unpinned لأنه لا توجد نقطة بيانات أخرى مرتبطة بالمواضيع التي تم تثبيتها سابقًا، حسب علمي. أم هل يمكنني استخدام post_actions هنا؟

أو ربما البحث عن أول منشور في موضوع من قبل مستخدم من الطاقم أو النظام يحتوي على “pinned … ago” للعد بناءً عليه؟ action_code => pinned.disabled

تحديث: يبدو أن هذا يعمل بطريقة ما…

SELECT t.user_id, current_timestamp granted_at
FROM badge_posts p
INNER JOIN topics t on t.id = p.topic_id
WHERE p.action_code ilike 'pinned.disabled'
GROUP BY t.user_id
HAVING count(*) > 0

لكنني لست متأكدًا مما إذا كان هذا هو أفضل نهج، وبما أن المنشور يمكن تثبيته وإلغاء تثبيته عدة مرات… لا أعرف ما إذا كان هذا الاستعلام يلتقط فقط حالة pinned.disabled واحدة لكل topic.id.

سيكون من المقدر جدًا الحصول على مساعدة من خبير في استعلامات SQL للشارات.

أو حتى النظر في تخزين التثبيتات بشكل منهجي في قاعدة البيانات مثل “الإعجابات” وما إلى ذلك في المستقبل، وعرضها في قسم الإحصائيات في ملف المستخدم وتحت روابط مثل “تم تثبيت موضوعك”. لأنه إذا تم تثبيت موضوع، فهذا يعتبر تقديرًا أعلى بكثير مقارنة بالإعجابات، ويجب أن يُؤخذ في الاعتبار.

تحديث:

لقد تمكنت من حل الأمر بنفسي الآن. إليك استعلام الشارة النهائي:

WITH unpinned AS ( /* الحصول على منشورات المواضيع المؤهلة التي تحتوي على عنصر واحد على الأقل من pinned.disabled */
	SELECT t.user_id, t.id
	FROM badge_posts p
	INNER JOIN topics t on t.id = p.topic_id
	WHERE p.action_code ilike 'pinned.disabled'
	GROUP BY t.id, t.user_id
	HAVING count(*) > 0
)
SELECT user_id, count(*), current_timestamp granted_at 
FROM unpinned
GROUP BY user_id
HAVING count(*) > 0

يجب تعديل العدّاد الأخير ليعكس عدد المواضيع التي كانت مثبتة في وقت ما، على سبيل المثال: >0 يعني موضوعًا مثبتًا واحدًا على الأقل، و>10 يعني عشرة مواضيع مثبتة على الأقل في الماضي.

اضطررتُ إلى استخدام حل bypass الخاص بـ pinned.disabled لأن منصة Discourse لا توفر أي نقطة بيانات أخرى حول سجلات التثبيت في قاعدة البيانات. كما أنه من المستحيل تمييز هذا الاستعلام بين التثبيتات العادية والتثبيتات العالمية بسبب نقص البيانات المتاحة.

يرى الكاتب أنه يجب إجراء هذا التغيير مستقبلاً، حيث إن التثبيت العالمي > التثبيت العادي > التعليقات > الإعجابات > المشاهدات تُعدّ إحصائيات تفاعل أفضل في رأيه، لكنها لا تُؤخذ في الاعتبار على الإطلاق حاليًا.