تحديث الإعجابات في `user_stats` في قاعدة البيانات عبر SQL

مرحباً بالجميع!

هل توجد مكان يمكنني من خلاله العثور على استعلام جاهز لتحديث likes_given و likes_received في جدول user_stats؟ لست متأكداً من مصدر ذلك، ربما يكون شيئاً يعتمد على ما هو موجود في جدول user_actions وجدول posts؟

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

UPDATE posts SET like_count = coalesce(cnt,0)
    FROM (
	SELECT post_id, count(*) cnt
	FROM post_actions
	WHERE post_action_type_id = 2 AND deleted_at IS NULL
	GROUP BY post_id
) x
WHERE posts.like_count <> x.cnt AND posts.id = x.post_id
UPDATE topics SET like_count = coalesce(cnt,0)
  FROM (
	SELECT topic_id, sum(like_count) cnt
	FROM posts
	WHERE deleted_at IS NULL
	GROUP BY topic_id
  ) x
WHERE topics.like_count <> x.cnt AND topics.id = x.topic_id

هذا يقوم بتحديث عدادات الإعجاب في posts و topics، لكنه لا يفعل ذلك في users_stats

ستحتاج إلى القيام بذلك في Rails أو عبر إضافة. لا يمكن لاستكشاف البيانات تغيير البيانات.

ستحتاج إلى مراجعة الكود في نماذج المستخدم أو إحصائيات المستخدم.

أنا أستخدم DBeaver، ويمكنني استخدام استعلامات UPDATE. افترضت أن “مستكشف البيانات” هو مجرد عميل قاعدة بيانات مكافئ آخر، آسف على حيرتي. أظن أن هذا لا ينتمي إلى هنا إذن، إذا أراد المسؤول تقسيم هذه المنشورات إلى موضوع منفصل، فلا بأس بذلك. أقترح عنوانًا مثل تحديث الإعجابات في user_stats عبر SQL.

لقد توصلت إلى ما يلي، لكنني لست متأكدًا من صحتها. أحب أن أتحقق من خلال معرفة مكان تم فيه ذلك بالفعل من قبل شخص أكثر خبرة، لكنني لم أستطع العثور عليه :slightly_frowning_face:

UPDATE user_stats SET likes_given = coalesce(cnt,0)
     FROM (
	SELECT user_id, count(*) cnt
	FROM post_actions
	WHERE post_action_type_id = 2 AND deleted_at IS NULL
	GROUP BY user_id
) x
WHERE user_stats.likes_given <> x.cnt 
          AND user_stats.user_id = x.user_id
UPDATE user_stats SET likes_received = coalesce(cnt,0)
     FROM (
	SELECT posts.user_id, SUM(posts.like_count) cnt
	FROM post_actions
	LEFT JOIN posts ON post_actions.post_id = posts.id
	WHERE post_action_type_id = 2 AND post_actions.deleted_at IS NULL
	GROUP BY posts.user_id
) x
WHERE user_stats.likes_received <> x.cnt 
       AND user_stats.user_id = x.user_id