Чтение самых последних значений в соединении без выполнения вложенного SELECT - PullRequest
0 голосов
/ 16 ноября 2010

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

   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

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

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

sample nested query results

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

Спасибо!

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

Ответы [ 2 ]

3 голосов
/ 16 ноября 2010

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

   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 голосов
/ 16 ноября 2010

Поскольку вы используете 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
...