Badge for posts with Likes from a specific group

As already mentioned here:

Grant a badge to everyone having posted at least <POST_COUNT> posts in the category <CATEGORY_NAME> that have received at least <LIKE_COUNT> likes by users in the group <TEAM_NAME>. Similar to the bug reporter badge here, but can require more than one like.

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 category_id = (
        SELECT id FROM categories WHERE name ilike '<CATEGORY_NAME>'
    ) AND (
        SELECT count(*)
        FROM post_actions pa
        WHERE pa.post_id = p.id
            AND post_action_type_id = (
                SELECT id FROM post_action_types WHERE name_key = 'like'
            ) AND pa.user_id IN (
                SELECT gu.user_id
                FROM group_users gu
                WHERE gu.group_id = ( SELECT id FROM groups WHERE name ilike '<TEAM_NAME>' ) 
            )
    ) >= <LIKE_COUNT>
    AND p.post_number = 1
    AND p.user_id >= 0
GROUP BY p.user_id
HAVING count(*) >= <POST_COUNT>
6 إعجابات

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

إعجابَين (2)

مرحباً @Firepup650 :slight_smile: ربما جرب هذا. لقد نجح معي.

<CATEGORY NAME> = اسم الفئة حساس لحالة الأحرف (وليس الاسم المختصر)
<GROUP> = اسم المجموعة (مثل: Staff, Trust_level_0)
<MINIMUM LIKE COUNT> = الحد الأدنى لعدد الإعجابات التي تريد تعيينها
<POST COUNT THRESHOLD> = الحد الأدنى لعدد المشاركات
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.category_id = (
        SELECT id FROM categories WHERE name ilike '<CATEGORY NAME>'
    ) AND (
        SELECT count(*)
        FROM post_actions pa
        WHERE pa.post_id = p.id
            AND post_action_type_id = (
                SELECT id FROM post_action_types WHERE name_key = 'like'
            ) AND pa.user_id IN (
                SELECT gu.user_id
                FROM group_users gu
                WHERE gu.group_id = ( SELECT id FROM groups WHERE name ilike '<GROUP NAME>' )
            )
    ) >= <MINIMUM LIKE COUNT>
    AND p.user_id >= 0
GROUP BY p.user_id
HAVING count(*) >= <POST COUNT THRESHOLD>

للفئات المتعددة يمكنك القيام بذلك:

<CATEGORY NAMES> = أسماء الفئات الحساسة لحالة الأحرف
<GROUP> = اسم المجموعة (مثل: Staff, Trust_level_0)
<MINIMUM LIKE COUNT> = الحد الأدنى لعدد الإعجابات التي تريد تعيينها
<POST COUNT THRESHOLD> = الحد الأدنى لعدد المشاركات
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.category_id IN (
        SELECT id FROM categories WHERE name ILIKE ANY (ARRAY['<CATEGORY NAME 1>', '<CATEGORY NAME 2>', '<CATEGORY NAME 3>'])
    ) AND (
        SELECT count(*)
        FROM post_actions pa
        WHERE pa.post_id = p.id
            AND post_action_type_id = (
                SELECT id FROM post_action_types WHERE name_key = 'like'
            ) AND pa.user_id IN (
                SELECT gu.user_id
                FROM group_users gu
                WHERE gu.group_id = ( SELECT id FROM groups WHERE name ILIKE '<GROUP>' )
            )
    ) >= <MINIMUM LIKE COUNT>
    AND p.user_id >= 0
GROUP BY p.user_id
HAVING count(*) >= <POST COUNT THRESHOLD>
إعجاب واحد (1)

أهلاً @Lilly!
يبدو أن كلا الاستعلامين رائعان، لكنني أردت فقط تشغيل الاستعلام على جميع الفئات إن أمكن. عندما حاولت، كنت أواجه أخطاءً حول استعلام فرعي يُرجع صفوفًا متعددة، لذا جئت للسؤال هنا عنه.

إعجاب واحد (1)

هل تقصد أنك تريد نفس الاستعلام لجميع الفئات؟

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 (
        SELECT count(*)
        FROM post_actions pa
        WHERE pa.post_id = p.id
            AND post_action_type_id = (
                SELECT id FROM post_action_types WHERE name_key = 'like'
            ) AND pa.user_id IN (
                SELECT gu.user_id
                FROM group_users gu
                WHERE gu.group_id = ( SELECT id FROM groups WHERE name ILIKE '<GROUP>' ) 
            )
    ) >= <MINIMUM LIKE COUNT>
    AND p.user_id >= 0
GROUP BY p.user_id
HAVING count(*) >= <POST COUNT THRESHOLD>
إعجاب واحد (1)

يبدو أن هذا سيعمل، ولكنه يفشل عندما تكون المجموعة التي تقوم بتشغيلها ضدها هي staff. لقد جربت كل من Staff و staff كاسم للمجموعة، وقمت مؤقتًا بتعيين عدد المنشورات والإعجابات إلى 1، ويقول إنه لن يتم منح أي شارات. ما الخطأ الذي أرتكبه هنا؟

إعجاب واحد (1)

حسناً، لقد استخدمت أحرفاً صغيرة في كلمة staff وعملت معي. :thinking:

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 (
        SELECT count(*)
        FROM post_actions pa
        WHERE pa.post_id = p.id
            AND post_action_type_id = (
                SELECT id FROM post_action_types WHERE name_key = 'like'
            ) AND pa.user_id IN (
                SELECT gu.user_id
                FROM group_users gu
                WHERE gu.group_id = ( SELECT id FROM groups WHERE name ILIKE 'staff' ) 
            )
    ) >= 1
    AND p.user_id >= 0
GROUP BY p.user_id
HAVING count(*) >= 1

:face_with_spiral_eyes: غريب، لا يزال لا يعمل لدي. سأحاول تشغيله على بعض المجموعات الأخرى لمعرفة ما إذا كان بإمكاني تحديد المشكلة.

تعديل: تم التشغيل على مجموعة مختلفة، وما زال الاستعلام فشل. لست متأكدًا من المشكلة هنا. هل يعتمد على المجموعات الأساسية عن طريق الصدفة؟

تعديل 2: لن ينجح ذلك، يبدو أن staff غير مسموح بتعيينها كمجموعة أساسية.

أعتقد أنني أعرف السبب. سأعمل على هذا من أجلك بعد تناول العشاء. أحتاج إلى تدريب على SQL على أي حال. شارة SQL أكثر تقييدًا من postgres. لقد تجاوزت جزء الاستعلام الفرعي. :slight_smile:

3 إعجابات

تم تقسيم 4 مشاركات إلى موضوع جديد: استعلام ‘معاينة’ لا يعمل في صفحة شارة SQL

لم أستيقظ تمامًا بعد، وأجد أن استعلامات الشارات تحتاج إلى كوبين من الشاي قبل أن أتمكن من معالجتها بالكامل، ولكني كنت أتحدث إلى الروبوت مؤخرًا حول هذه الأنواع من الاستعلامات، وأعتقد أن استخدام post_action_code_id الفعلي ورمز group_id أفضل من استخدام استعلامات SELECT المتداخلة للعثور على نفس الشيء.

إعجاب واحد (1)

لقد فعلت هذا للحصول على جداول المخطط الضرورية لـ posts و posts_actions و group_users و groups.

SELECT column_name, data_type, character_maximum_length
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = '<TABLE NAME>';

ثم استخدمت هذا للحصول على جميع معرفات المجموعات:

SELECT name, id FROM groups ORDER BY name

لذلك، قمت بتضمين جميع جداول المخطط المطلوبة وأصدرت تعليمات لـ Lola، أو GPTbot لاستخدام معرف post_action_code الفعلي ومعرف group_id. ثم بعد بعض الجدال ذهابًا وإيابًا وإجراء بعض التصحيحات. توصلنا إلى هذا. مرة أخرى، يبدو أنه يعمل في مستكشف البيانات، لكنني ما زلت لا أستطيع استخراج أي شيء منه في معاينة الشارات.

G = group_id
X = minimum number of likes
Y = minimum number of posts
SELECT pa.user_id, MIN(pa.post_id) as post_id, COUNT(pa.post_id) as post_count, COUNT(pa.id) as like_count, MAX(pa.created_at) as granted_at
FROM post_actions pa
JOIN group_users gu ON gu.user_id = pa.user_id
WHERE gu.group_id = G AND pa.post_action_type_id = 2
GROUP BY pa.user_id
HAVING COUNT(pa.post_id) >= Y AND COUNT(pa.id) >= X

نعم، لقد أسميت GP4bot لولا

أنا أسميه بيرت. :slight_smile: على الرغم من أن لدينا علاقة معقدة.

أعتقد أن هناك قيدًا آخر لهذا النوع من الاستعلام وهو استخدام MIN(p.created_at) granted_at الذي يعطيني تاريخ أول واحد لهم وليس، على سبيل المثال، تاريخ العاشر لهم. يمكن تغييره إلى MAX، ولكن هذا سيعطي أيضًا تاريخًا “غير صحيح” إذا قمت بتشغيله على بيانات تاريخية حيث كان لديهم بالفعل أكثر من 10.

ما زلت أفكر في ذلك.

لقد حققت بعض النجاح باستخدام ROW_NUMBER()، ولكن لم يكن هناك شيء ملموس حتى الآن.

إعجابَين (2)

أتفق. لا يزال هناك شيء ما لا يبدو صحيحًا. سأذهب إلى الفراش. :sweat_smile:

3 إعجابات

أنا أستمتع بهذا على الرغم من أنه يساعدني على إعادة تعلم لغة SQL وكيفية كتابة استعلامات أفضل. وجود لولا / GPT4bot كمساعد لـ SQL مفيد، ولكن عليك توجيهها وطرح الأسئلة بالطريقة الصحيحة. حاولت إيجاد طرق لمنحها الوصول إلى معظم معلومات جداول المخطط حتى لا أضطر إلى القيام بذلك لكل مشكلة استعلام نعمل عليها. إن تقديم معلومات مخطط الجدول يعطي نتائج أفضل بكثير. حاولت إعطائها رابطًا للمخططات المتاحة في core ولكن هذا جعلها تبحث في جوجل.

أنا مهتم بالعمل معها عندما أعرف أن معاينة استعلام الشارة تعمل. أحتاج إلى ممارسة لغة SQL وإجراء استعلامات الشارات. بالمناسبة، لا يمكنها إصلاحها ولا تزال تجعل شاي إيرل جراي الخاص بي ليس ساخنًا بما فيه الكفاية. على الرغم من أن درس SQL الليلة الماضية كان أفضل موعد لي منذ سنوات. :facepalm:

إعجابَين (2)

باستخدام هذا الاستعلام، يبدو أننا واجهنا مشكلة غريبة. يبدو أنه تم منحه للموظفين فقط، وأنا شبه متأكد من أن بعض غير الموظفين قد يستوفون هذا المعيار. هل هذا شيء كسرته في مكان ما، أم أنها مشكلة في الاستعلام؟

إعجابَين (2)

نعم، أعرف أن هناك خطأ ما، سأعمل على هذا بمجرد تحديث المثيل الخاص بي بإصلاح المعاين.

إعجابَين (2)

فقط لإعادة الضبط، أعتقد أن التناقض قد أربكني. :slight_smile:

هل الهدف من هذا هو منح شارة لكمية معينة من المشاركات عبر جميع الفئات التي أعجب بها @staff مرة واحدة على الأقل؟

إعجاب واحد (1)

كنت أقصد منحها للمستخدمين الذين لديهم X عدد من المشاركات مع Y إعجابات من قبل الموظفين، عبر جميع الفئات. في حالتي، 10 مشاركات، 5 إعجابات.

3 إعجابات

بعد وميض مربك مع بعض الإعجابات المحذوفة التي أربكت اختباراتي، أعتقد أن هذه نسخة منقحة من النسخة الموجودة في المنشور الأصلي والتي تناسب معاييرك: :slight_smile:

SELECT p.user_id, MAX(p.created_at) granted_at
FROM badge_posts p
WHERE (SELECT COUNT(*)
        FROM post_actions pa
        WHERE pa.post_id = p.id
         AND post_action_type_id = 2
         AND deleted_at IS NULL
         AND pa.user_id IN (SELECT gu.user_id FROM group_users gu WHERE gu.group_id = 3)
       ) >= 5
    AND p.user_id >= 0
GROUP BY p.user_id
HAVING COUNT(*) >= 10

يعمل هذا على عرض badge_posts لذا فهو يحسب فقط المشاركات من الفئات العامة، والتي قد ترغب في أخذها في الاعتبار اعتمادًا على إعدادات المنتدى/الفئة الخاصة بك. أيضًا، استخدام CURRENT_TIMESTAMP لـ granted_at هو خيار آخر، ولكنه ربما يعود إلى مسألة ذوق.

إعجابَين (2)