Разбивка на страницы результатов поиска на PHP

#php #mysql #pagination

#php #mysql #разбивка на страницы

Вопрос:

Я создаю поиск на основе PHP с помощью mysql.

Но я столкнулся с этой проблемой: у меня очень длинный и тяжелый (на сервере mysql) запрос для поиска.

Для разбивки результатов на страницы мне требуются следующие данные:

  • Количество всех результатов (не ограничено, поэтому я знаю, сколько номеров нужно показать)
     SELECT COUNT(*) as count FROM table WHERE col="val"
     
  • Ограниченные результаты — я показываю их пользователю
     SELECT * FROM table WHERE col="val" LIMIT 20, 10
     

Как мне избежать наличия 2 отдельных запросов для 2 требований, упомянутых выше?

Обратите внимание: чтобы избежать вопроса «насколько тяжелым может быть ваш запрос?», Это мое реальное условие where:

     SELECT *, 
    (1000 * 6371 * acos( cos( radians(42.6051862) ) * cos( radians( project_lat ) ) * cos( radians( project_lng ) - radians(23.037836800000036) )   sin( radians(42.6051862) ) * sin( radians( project_lat ) ) ) ) AS distance
    FROM `projects` 

    JOIN `subcategories` ON `projects`.`subcat_id` = `subcategories`.`subcat_id` 
    JOIN `categories` ON `subcategories`.`cat_id` = `categories`.`cat_id`
    JOIN `project_images` ON `projects`.`project_id` = `project_images`.`project_id` 

    WHERE `projects`.`subcat_id` = 618 
    AND `project_start` < '2016-10-30' 
    AND `project_start` > '2016-10-14' 
    AND `project_price` > 123 
    AND `project_price` < 233 
    AND `project_currency` = 'BTN' 
    AND `project_approved` = 1 
    AND MATCH (project_title, project_description) AGAINST ('test') 
    GROUP BY `projects`.`project_id` 
    HAVING `distance` < 7400
 

Ответ №1:

Используйте sql_calc_found_rows

 SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();