Я не думаю, что SQL_CALC_FOUND_ROWS
разрешено для внутреннего запроса.
Вместо этого введите внешний запрос.
SELECT SQL_CALC_FOUND_ROWS inner_table.*
....
Также у вас есть ошибка в последней строке:
ORDER BY inner_table.lastpost_time DES
Заменить его на:
ORDER BY inner_table.lastpost_time DESC
UPDATE
В ответ на ваш комментарий предлагаются следующие обходные идеи.
Вывести внутренний выбор в временную таблицу.
Используя такой код:
/* do this once*/
CREATE TABLE `temp_table` LIKE SELECT topics.topic_id
, topics.date_added ....
/*do this for every query*/
DELETE FROM temp_table WHERE temp_table.topic_id <> 0;
INSERT INTO temp_table SELECT topics.topic_id
, topics.date_added
, topics.title
.... /*!! without the limit clause !!*/
SELECT count(*) as rowcount FROM temp_table;
/*then use the temp_table in place of the inner select*/
SELECT inner_table.*
, users.username as last_username
, posts.date_added as last_date_added
, users.user_id as last_user_id
, posts.date_added as last_post_date
FROM temp_table .....
LIMIT ....
Использование SQL_CALC_FOUND_ROWS не работает на INSERT. Также выберите SELECT, но приведенный выше код является обходным путем, вы, конечно, можете выполнить внутренний запрос отдельно с LIMIT 1
, чтобы сделать его максимально быстрым.