لقد أنشأت هذا الاستعلام، لكنني واجهت مشكلة في حالتي.
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[])
لديّ سؤالان:
كيف يمكنني تعريف جدول Categories والحصول على هذه الرسالة خطأ؟
كيف يمكنني بدء الفترة بعد يوم واحد من اليوم الحالي؟
السبب في ظهور الرسالة هو عدم وجود عمود category_id في جدول المنشورات. لكي يعمل الاستعلام، يجب عليك إجراء عملية ربط (join) مع جدول المواضيع.
على هذا النحو:
LEFT JOIN topics t ON t.id = p.topic_id
إذا قمت بتوضيح البيانات التي تحتاجها، يمكنني محاولة تعديل الاستعلام.
هل تبحث عن جميع المنشورات (وليس المواضيع) التي تنتمي إلى الفئتين 48 و23؟ هل يجب استبعاد المنشورات والمواضيع المحذوفة من النتيجة؟
الدالة CURRENT DAY() تعيد تاريخ اليوم. ما هي الفترة التي تريد البحث عنها؟
الفترة التي تم أخذها في الاعتبار في الاستعلام: 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)