Внутреннее объединение с учетом запроса на обновление - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть этот запрос:

update posts 
set rank = (SELECT FIND_IN_SET( CONCAT(points, '_', comments_count, '_', created_at), 
    (SELECT GROUP_CONCAT( CONCAT(points, '_', comments_count, '_', created_at) ORDER BY points desc, comments_count desc, created_at desc ) 
FROM (select *, COUNT(comments.id) as comments_count from posts) as posts_rankings INNER JOIN comments ON comments.post_id = posts_rankings.id)))

Я хочу получить количество комментариев к каждому сообщению и следующему заказу с этим счетом.Как я могу это сделать?Теперь я получаю ошибку :: unknown column comments.id in field list

Структура моих таблиц:

enter image description here

enter image description here

Я вычисляю ранг должности в зависимости от порядка points, comments_count и created_at.

1 Ответ

0 голосов
/ 14 февраля 2019

Вы не можете выбрать сгруппированные и не сгруппированные значения в одном и том же подзапросе.Вам нужны два подзапроса, один для выполнения 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 достаточно большой, чтобы вместить все результаты в этом подзапросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...