Actualización de Likes en `user_stats` en la base de datos mediante SQL

¡Hola a todos!

¿Hay algún lugar donde pueda encontrar una consulta predefinida para actualizar likes_given y likes_received en la tabla user_stats? No estoy seguro de dónde debería provenir eso; probablemente algo basado en lo que hay en las tablas user_actions y posts.

Esto es para una migración en la que ya estoy utilizando algunas consultas que tomé de uno de los importadores, creo:

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

Eso actualiza los recuentos de “Me gusta” en posts y topics, pero no en user_stats

Necesitarás hacerlo en Rails o mediante un plugin. Data Explorer no puede modificar datos.

Tendrás que revisar el código en los modelos de usuario o de estadísticas de usuario.

Estoy usando DBeaver, puedo ejecutar consultas UPDATE. Asumí que “Data explorer” era simplemente otro cliente de bases de datos equivalente, perdón por mi confusión. Supongo que esto no pertenece aquí entonces; si un administrador quiere dividir estos mensajes en un hilo separado, está bien. Sugiero un título como Actualización de likes en user_stats mediante SQL.

He ideado lo siguiente, pero no estoy seguro de si son correctas. Me encantaría verificarlas buscando algún lugar donde alguien más experimentado ya lo haya hecho, pero no logro encontrarlo :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