Обновление лайков в `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, но не в user_stats

Вам нужно сделать это в Rails или через плагин. Data Explorer не может изменять данные.

Вам следует изучить код в моделях User или User Stats.

Я использую DBeaver, там можно выполнять запросы UPDATE. Я предположил, что «Data explorer» — это просто ещё один эквивалентный клиент для БД, извините за путаницу. Похоже, это не совсем сюда, если администратор захочет разделить эти сообщения в отдельную тему, это нормально. Предлагаю заголовок вроде Обновление likes в 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