استعلام مستكشف البيانات: البحث عن منشورات بدون ردود

فيما يلي الرابط للموضوع: How to find topics without a reply from someone other than the topic owner?

لقد أنشأت هذا الاستعلام، لكنني واجهت مشكلة في حالتي.

PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "t"
LINE 31:    AND t.category_id = ANY ('{48,23}'::int[])

إليك كود الاستعلام:

-- [params]
-- int :months_ago = 1

WITH query_period as (
    SELECT
        date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' as period_start,
        date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' + INTERVAL '1 month' - INTERVAL '1 second' as period_end
)

SELECT 
p.created_at,
p.topic_id,
p.id as post_id,
p.like_count,
p.post_number,
p.reply_count
FROM posts p
LEFT JOIN post_search_data psd ON psd.post_id = p.id
RIGHT JOIN query_period qp
    ON p.created_at >= qp.period_start
        AND p.created_at <= qp.period_end
WHERE 
      reply_count = 0
      AND post_number != 0
	  AND t.category_id = ANY ('{48,23}'::int[])

لديّ سؤالان:

  1. كيف يمكنني تعريف جدول Categories والحصول على هذه الرسالة خطأ؟
  2. كيف يمكنني بدء الفترة بعد يوم واحد من اليوم الحالي؟
إعجاب واحد (1)

السبب في ظهور الرسالة هو عدم وجود عمود category_id في جدول المنشورات. لكي يعمل الاستعلام، يجب عليك إجراء عملية ربط (join) مع جدول المواضيع.

على هذا النحو:
LEFT JOIN topics t ON t.id = p.topic_id

إذا قمت بتوضيح البيانات التي تحتاجها، يمكنني محاولة تعديل الاستعلام.
هل تبحث عن جميع المنشورات (وليس المواضيع) التي تنتمي إلى الفئتين 48 و23؟ هل يجب استبعاد المنشورات والمواضيع المحذوفة من النتيجة؟

الدالة CURRENT DAY() تعيد تاريخ اليوم. ما هي الفترة التي تريد البحث عنها؟

3 إعجابات

شكرًا لك على الرد!

صحيح.

صحيح (لا ينبغي تضمين المواضيع في الاستعلام).

شهر واحد بدءًا من الطابع الزمني (الوقت الحالي - 24 ساعة).

إعجابَين (2)

تم تجاهل المنشورات المرتبطة بمواضيع محذوفة أيضًا.

الفترة التي تم أخذها في الاعتبار في الاستعلام: period_start: 2021-01-14 / period_end: 2021-02-14

-- [params]
-- int :months_ago = 1

WITH query_period as (
    SELECT
        DATE_TRUNC('day', CURRENT_DATE - INTERVAL '1 day') - INTERVAL ':months_ago months' AS period_start,
        (CURRENT_DATE - INTERVAL '1 day')  AS period_end
)

SELECT 
    p.created_at,
    p.topic_id,
    p.id AS post_id,
    p.like_count,
    p.post_number,
    p.reply_count
FROM posts p
INNER JOIN topics t ON t.id = p.topic_id
WHERE p.reply_count = 0
    AND p.post_number > 1
    AND t.category_id IN (48, 23)
    AND p.deleted_at IS NULL
    AND t.deleted_at IS NULL
    AND p.created_at >= (SELECT period_start FROM query_period)
    AND p.created_at <= (SELECT period_end FROM query_period) 
3 إعجابات

عظيم! الكود يعمل بشكل صحيح.

لكن عند تجربته، وجدت أن النتائج تتضمن أيضًا منشورات من مستخدمين يجب استبعادهم. في منتداك، تُنفَّذ وظيفة الإشراف من قبل أعضاء مجموعات محددة.

هل يمكننا استبعاد منشورات المستخدمين المنتمين إلى مجموعات معينة في الاستعلام؟

لقد تفحصت ملف .json لصفحة الموضوع ووجدت أنه يتتبع بشكل ظاهر تفاصيل المستخدم التالية فقط:

  • “moderator”
  • “admin”
  • “staff”
  • primary_group_name (غير مُعَدَّ في منتداك، لأن المشرفين يمكن أن ينتموا إلى مجموعات مختلفة)
3 إعجابات