В интересах устранения как можно большего числа вложенных запросов я пытаюсь оптимизировать следующий запрос:
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
Извините, если вы обнаружили какие-либо ошибки... Я пробовал использовать этот запрос только для соответствующих частей, и я мог бы совершить ошибку где-то в процессе
Итак, в основном, мы имеем здесь таблицу сообщений на форуме и таблицу ответов на эти сообщения. Каждый пост форума может иметь несколько ответов. Первое соединение используется для подсчета общего количества ответов, а второе соединение используется для получения самой последней информации ответа. То, что я получаю от этого запроса, выглядит примерно так:
Итак, я в основном пытаюсь выяснить, как я могу это сделать, не прибегая к этому вложенному запросу. Любая помощь, которую вы, ребята, можете предоставить, была бы чрезвычайно полезна.
Спасибо!
Изменить. Я немного скорректировал запрос, чтобы отразить тот факт, что мне нужно отменить не только latest_activity_time
, но и latest_activity_user_id
. Извините за путаницу!
Использование:
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
Поскольку вы используете 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
latest_activity_time
, но также идентификатор_пользователя и имя пользователя для этого последнего действия. Есть ли способ сделать это, используя MAX (c.date) в полях выбора?comments
имеет собственный столбецuser_id
.