أود الحصول على قائمة بجميع الوسوم وعدد الموضوعات/المنشورات الجديدة التي تم إنشاؤها لكل منها خلال فترة معينة (مثل الشهر الماضي). هل يمكن لأي شخص مساعدتي في صياغة الاستعلام؟
يمكنك بالتأكيد تفحّص الملفات، ولكن في رأيي الشخصي، من الأكثر كفاءة استخدام القائمة الموجودة في صفحة إدارة الإضافات. يجب أن تتمكن من رؤية العديد من الجداول التي، عند تحديدها، تعرض أسماء الحقول ومعلومات المخطط.
لستُ على سطح المكتب الآن، لكن النموذج يحتوي على:
# == Schema Information
#
# Table name: topic_tags
#
# id :integer not null, primary key
# topic_id :integer not null
# tag_id :integer not null
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_topic_tags_on_topic_id_and_tag_id (topic_id,tag_id) UNIQUE
لاحظ “topic_id” و “tag_id”؛ فهي توحي بأن الأسماء تتبع النمط “اسم الجدول، شرطة سفلية، اسم الحقل”.
أما جدول الوسوم (tags) فيحتوي على:
# == Schema Information
#
# Table name: tags
#
# id :integer not null, primary key
# name :string not null
# topic_count :integer default(0), not null
# created_at :datetime not null
# updated_at :datetime not null
# pm_topic_count :integer default(0), not null
# target_tag_id :integer
#
# Indexes
#
# index_tags_on_lower_name (lower((name)::text)) UNIQUE
# index_tags_on_name (name) UNIQUE
وسأترك لك مهمة فحص حقول جداول المواضيع.
ولكن ربما هذا يتقدّم على الأمور. هل تمكّنت من تنفيذ استعلام بسيط جدًا على أحد هذه الجداول كنوع من “مرحبًا أيها مستكشف البيانات”؟ وما هو؟
رائع، شكرًا جزيلاً على التلميحات.
تمكنت من بنائه. قد لا يكون مثاليًا، لكن إذا وجد أي شخص آخر أنه مفيد:
مواضيع جديدة لكل وسم
-- [params]
-- int :months_ago = 0
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
tags.name,
count(1) as topic_count
FROM topics t
RIGHT JOIN topic_tags tt
ON t.id = tt.topic_id
RIGHT JOIN tags tags
ON tt.tag_id = tags.id
RIGHT JOIN query_period qp
ON t.created_at >= qp.period_start
AND t.created_at <= qp.period_end
WHERE t.user_id > 0
AND tt.topic_id IS NOT NULL
GROUP BY tags.name
ORDER BY topic_count DESC