Чтение самых последних значений в соединении без выполнения вложенного SELECT

0

В интересах устранения как можно большего числа вложенных запросов я пытаюсь оптимизировать следующий запрос:

   SELECT fp.id, 
          fp.user_id, 
          COUNT(c.id) AS num_replies, 
          c2.created AS latest_activity_time, c2.user_id AS latest_activity_user_id
     FROM forum_posts fp
LEFT JOIN comments c ON c.object_id = fp.id
LEFT JOIN (SELECT created, user_id
             FROM comments 
         ORDER BY created DESC 
            LIMIT 1) AS c2 ON fp.id = c2.object_id
    WHERE fp.deleted != 1
 GROUP BY fp.id

Извините, если вы обнаружили какие-либо ошибки... Я пробовал использовать этот запрос только для соответствующих частей, и я мог бы совершить ошибку где-то в процессе

Итак, в основном, мы имеем здесь таблицу сообщений на форуме и таблицу ответов на эти сообщения. Каждый пост форума может иметь несколько ответов. Первое соединение используется для подсчета общего количества ответов, а второе соединение используется для получения самой последней информации ответа. То, что я получаю от этого запроса, выглядит примерно так:

Изображение 174551

Итак, я в основном пытаюсь выяснить, как я могу это сделать, не прибегая к этому вложенному запросу. Любая помощь, которую вы, ребята, можете предоставить, была бы чрезвычайно полезна.

Спасибо!

Изменить. Я немного скорректировал запрос, чтобы отразить тот факт, что мне нужно отменить не только latest_activity_time, но и latest_activity_user_id. Извините за путаницу!

Теги:
join
greatest-n-per-group

2 ответа

3
Лучший ответ

Использование:

   SELECT fp.id,
          fp.user_id,
          COUNT(a.id) AS num_replies,
          c.date AS latest_activity_time,
          c.user_id AS latest_activity_user_id
     FROM FORUM_POSTS fp
LEFT JOIN COMMENTS a ON a.object_id = fp.id         
LEFT JOIN (SELECT x.object_id,
                  x.date, 
                  x.user_id
             FROM COMMENTS x
             JOIN (SELECT t.object_id,
                          MAX(t.date) AS max_date
                     FROM COMMENTS t
                 GROUP BY t.object_id) y ON y.object_id = x.object_id
                                        AND y.max_date = x.date) b ON b.object_id = fp.id
    WHERE fp.deleted != 1
 GROUP BY fp.id
  • 0
    Спасибо за ответ, @OMG Пони. Теперь я понимаю, что, пытаясь свести к минимуму запрос, я выбрал самое важное: мне нужно получить не только latest_activity_time , но также идентификатор_пользователя и имя пользователя для этого последнего действия. Есть ли способ сделать это, используя MAX (c.date) в полях выбора?
  • 0
    @OMG Ponies: извините за задержку. Я исправил свой первоначальный вопрос с (надеюсь) более точной версией исходного запроса. Чтобы ответить на ваш вопрос напрямую: да, таблица comments имеет собственный столбец user_id .
Показать ещё 10 комментариев
0

Поскольку вы используете MySQL, вы должны уйти со следующим:

   SELECT fp.id, 
          fp.user_id, 
          COUNT(c.id) AS num_replies, 
          c.created AS latest_activity_time, 
          c.user_id AS latest_activity_user_id
     FROM forum_posts fp
LEFT JOIN comments c ON c.object_id = fp.id
    WHERE fp.deleted != 1
 GROUP BY fp.id
 ORDER BY fp.id, c.created
  • 0
    Спасибо за ответ, но это не дает ожидаемого результата. Таблица комментариев по-прежнему сортируется по столбцу идентификатора по умолчанию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню