تصفية إعجابات المستخدمين إذا تم إنشاء الحساب قبل X يومًا من إنشاء الموضوع

أهلاً،

أنا أحاول إضافة فلتر آخر حيث إذا كان المستخدم قد تم إنشاؤه قبل أقل من يومين من إنشاء موضوع معين، فلن يتم تضمينه.

هذا ما جربته. أنا جديد نسبيًا في SQL لذا لست متأكدًا من كيفية المتابعة. أي مساعدة؟

SELECT *
FROM topic t post_actions pa INNER JOIN users u ON u.id = pa.user_id
WHERE post_id = 1 
    AND post_action_type_id = 2
    AND u.created_at < t.created_at-2

لست متأكدًا مما تبحث عنه في هذا؟ هل يمكنك أن تعطينا المزيد من التفاصيل حول ما تحاول تحقيقه؟

أحاول إصلاح فلتر التاريخ لاستبعاد المستخدمين الذين تم إنشاؤهم قبل أقل من يومين من إنشاء موضوع معين. قيل لي إما datediff أو INTERVAL ولكن لم ينجح أي منهما.

وكنت بحاجة إلى مساعدة في إضافة الموضوع t كـ inner join آخر ولكنني قمت بحل ذلك باستخدام:
FROM post_actions pa INNER JOIN users u ON u.id = pa.user_id INNER JOIN topics t on t.id = t.id
يظهر معرف t كرقم بدلاً من معاينة، هل هناك أي طريقة للتعامل مع ذلك أيضًا؟

بالنسبة لهذا، تحتاج فقط إلى استبدال t.id AS topic_id وسيعمل سحره لك. :+1:

هناك المزيد من الأمثلة على سحر المستكشف (Explorer) الذي يمكنك استخدامه في هذا الموضوع - IDs in Data Explorer - #3 by tshenry أيضًا

عندما تقول “موضوع معين”، هل سيكون هو نفس الموضوع في كل مرة؟ (أي، معرف موضوع ثابت)

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

نعم، نفس الموضوع في كل مرة.

أعتقد أنني نجحت في ذلك باستخدام هذا. كان هناك أكثر من 1000 نتيجة من هذا، لذا حاولت إضافة
AND t.id = post.topic_id

هذا قلل القائمة إلى 16 نتيجة، لكن لا تزال هناك 4 نتائج لنفس الشيء. لست متأكدًا من كيفية إصلاح ذلك.

SELECT
    t.id as topic_id,
    pa.post_id,
    pa.user_id,
    pa.created_at,
    u.created_at
FROM  post_actions pa INNER JOIN users u ON u.id = pa.user_id INNER JOIN topics t on t.id = t.id INNER JOIN posts p on p.topic_id = p.topic_id
WHERE post_id = 15000
    AND t.id = 7000
    AND post_action_type_id = 2
    AND u.created_at < t.created_at - INTERVAL '2 DAY'

تعديل: تم تغيير
INNER JOIN posts p on p.topic_id = p.topic_id
إلى
INNER JOIN posts p on p.topic_id = t.id
مما أدى إلى تقليصها إلى 16 نتيجة كما كان من قبل.

الآن أعتقد أن السبب في وجود 16 نتيجة لا يزال هو أن t.id = t.id. لست متأكدًا مما يمكنني تغييره إليه.

هناك بعض المشاكل مع هذا، على الرغم من أنني لست بارعًا بما يكفي في SQL لشرحها بالكامل. :slightly_smiling_face:

أعتقد أنك لن تحتاج إلى topic_id إذا كان لديك بالفعل post_id، حيث أن معرف المنشور فريد لهذا المنشور (والموضوع). يبدو أيضًا أنك تحاول ربط بعض الجداول الإضافية بحقول غير موجودة في الجدول الثاني (على سبيل المثال، t.id = t.id هو نفس الحقل تمامًا داخل جدول المواضيع). وإذا كان الموضوع الذي تستعلم عنه ثابتًا، فلن تحتاج إلى INTERVAL نسبي لأنه سيكون دائمًا نفس التاريخ (أي قبل يومين من إنشاء المنشور 15000)، لذا يمكنك تعيينه كتاريخ صريح.

لم تتح لي الفرصة لتجربة نسختي الخاصة بعد، لكنني تعلمت معظم مهاراتي في SQL/الشارات من البحث في Meta عن أمثلة مختلفة وجمع أجزاء منها. :slight_smile: الكثير منها تحت علامة التصنيف #data-explorer، وهناك مجموعة من الأمثلة لأشياء مختلفة في بعض أفكار استعلامات الشارات الشائعة والتي قد تستحق التصفح؟

نعم أعرف، ولكن في كل مرة أقوم فيها بإزالة AND لمعرف الموضوع، تعود النتائج إلى 1000 لسبب ما. سألقي نظرة على الرابط الذي أرسلته. آمل أن أتمكن من حل بعض المشكلات هناك.

لست متأكدًا مما إذا كنت أفهم ما تريده هنا، ولكن إذا كنت تعرف معرف المنشور والتاريخ الذي تريد تضمين مستخدمين جدد منه، فربما يكون شيئًا كهذا؟

-- [params]
-- int :post_id
-- date :date


SELECT pa.user_id,
       pa.created_at AS reltime$time
FROM post_actions pa
JOIN users u ON u.id = pa.user_id
WHERE pa.post_id = :post_id
AND post_action_type_id = 2
AND u.created_at::date > :date
ORDER BY pa.created_at DESC

هذا سيعطي قائمة بالمستخدمين الذين أعجبوا بمنشور معين، والذين تم إنشاء حساباتهم بعد التاريخ الذي تدخله (مرتبة حسب وقت إعجابهم).

إعجابَين (2)

لقد تمكنت من جعل كل شيء يعمل، لم أكن أعرف عن الوقت الفعلي وقمت بتطبيقه فيه. شكراً مرة أخرى على المساعدة!

سؤال أخير يتعلق بالوقت الفعلي. هل هناك طريقة لتغيير الاسم من “time” إلى “Topic created”؟

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

بالتأكيد. :slightly_smiling_face: إذا قمت بتغييره إلى reltime$topic_created، فسيؤدي ذلك إلى حل المشكلة. :+1:

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.