Вы не можете выбрать сгруппированные и не сгруппированные значения в одном и том же подзапросе.Вам нужны два подзапроса, один для выполнения GROUP_CONCAT()
всех сообщений, а другой для получения значения для каждого конкретного сообщения и получения его ранга в объединенном списке.
UPDATE posts AS p
JOIN (
SELECT p1.id, FIND_IN_SET(CONCAT_WS('_', p1.points, p1.comments_count, p1.created_at), all_post_counts) AS rank
FROM (
SELECT p.id, p.created_at, p.points, IFNULL(COUNT(c.id), 0) AS comments_count
FROM posts AS p
LEFT JOIN comments AS c ON c.post_id = p.id
GROUP BY p.id
) AS p1
CROSS JOIN (
SELECT GROUP_CONCAT(CONCAT_WS('_', p1.points, p1.comments_count, p1.created_at) ORDER BY points desc, comments_count desc, created_at desc) AS all_post_counts
FROM (
SELECT p.id, p.created_at, p.points, IFNULL(COUNT(c.id), 0) AS comments_count
FROM posts AS p
LEFT JOIN comments AS c ON c.post_id = p.id
GROUP BY p.id
) AS p1
) AS p3
) AS p4
ON p.id = p4.id
SET p.rank = p4.rank
Убедитесь, что вы установили group_concat_max_len
достаточно большой, чтобы вместить все результаты в этом подзапросе.