SQL_CALC_FOUND_ROWS ошибка возврата - PullRequest
1 голос
/ 21 мая 2011

Я использую вложенный запрос MySQL для получения пользовательских сообщений, и когда я помещаю SQL_CALC_FOUND_ROWS в дочерний запрос, MySQL возвращает ошибку: Incorrect usage/placement of 'SQL_CALC_FOUND_ROWS'

Запрос:

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 (
    SELECT SQL_CALC_FOUND_ROWS topics.topic_id
      , topics.date_added
      , topics.title
      , topics.user_id
      , MAX(posts.post_id) as last_post
      , posts.user_id as post_user_id
      , users.username
      , topics.previews
      , topics.fcat_id
      , topics.is_important
      , topics.is_locked
      , topics.lastpost_time
      , (SELECT COUNT(*) FROM posts WHERE posts.topic_id=topics.topic_id) as posts_cnt
    FROM topics
    LEFT JOIN users ON (users.user_id = topics.user_id)
    LEFT JOIN posts ON (topics.topic_id = posts.topic_id)
    WHERE topics.user_id = ".$this->session->getSession("user_data", "user_id")."
    OR ".$this->session->getSession("user_data", "user_id")."
    IN (
      SELECT DISTINCT user_id
      FROM posts
      WHERE posts.topic_id = topics.topic_id
    )
    GROUP BY topics.topic_id
    ORDER BY topics.lastpost_time DESC
    LIMIT ".$limit * $page.", ".$limit."
    ) as inner_table
LEFT JOIN `posts` ON (posts.post_id=inner_table.last_post)
LEFT JOIN `users` ON (users.user_id=posts.user_id)
ORDER BY inner_table.lastpost_time DESC

1 Ответ

1 голос
/ 22 мая 2011

Я не думаю, что 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, чтобы сделать его максимально быстрым.

...