Как улучшить SQL-запрос для нумерации страниц? - PullRequest
0 голосов
/ 13 октября 2018

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

SELECT *, COUNT(*) AS 'count' 
FROM product
INNER JOIN product_category
  on product.product_category_id = product_category.id 
INNER JOIN  company_manufacturer_product 
  on product.company_manufacturer_product_id =
     company_manufacturer_product.id
GROUP BY 1 LIMIT 6 OFFSET 0;

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

Часть кода, где я формирую запрос:

StringBuilder startResponse = new StringBuilder("SELECT *, COUNT(*) AS 'count' FROM product " +
                "INNER JOIN product_category on product.product_category_id = product_category.id " +
                "INNER JOIN company_manufacturer_product on product.company_manufacturer_product_id=company_manufacturer_product.id");
if (nonNull(form.getProductMax()) && nonNull(form.getPage())) {
            startResponse.append(" LIMIT ").append(form.getProductMax()).append(" OFFSET ").append(form.getPage() * form.getProductMax());
        }

Моя база данных восстанавливается без LIMITи OFFSET:

enter image description here

Моя база данных реагирует, когда я использую запрос, описанный выше, этот запрос отправляется в базу данных, когда я перехожу на первую страницус товаром: enter image description here

Когда я перехожу на вторую страницу с товаром, я отправляю такой запрос в базу данных

SELECT * , COUNT(*) AS 'count' 
FROM product 
INNER JOIN product_category
  on product.product_category_id = product_category.id
INNER JOIN company_manufacturer_product 
  on product.company_manufacturer_product_id = 
     company_manufacturer_product.id
GROUP BY 1 LIMIT 6 OFFSET 6;

и у меня есть ответвот так:

enter image description here

Не могу понять в чем проблема.Я должен использовать запросы через COUNT!Как доказать это?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Не против решения этого вопроса, согласно вышеописанному способу, добавление order by к исходному sql может решить проблему.Но я думаю, у меня есть лучшая практика для разбивки на страницы: использование таких параметров, как has_more, last_product_id и limit_num для соединения клиентов с сервером.

has_more указывает больше данных на сервере, независимо от того, оставлены они или нет;last_product_id указывает идентификатор данных последнего ответа;limit_num указывает количество страниц на странице.

Таким образом, клиент может использовать has_more для определения отправки запроса или нет, если это так, клиент отправляет запрос с last_product_id и limit_num на сервер;а для сервера sql может быть таким:

select * from table where id < $last_product_id order by id desc
limit $limit_num + 1; =>$datas

И, count ($ datas) и $ limit_num для вычисления значений has_more и last_product_id:

$has_more = 0;
$data_num = count($datas);
if ($data_num > $page_limit) {
    $has_more = 1;
    array_pop($datas);
    $data_num--;
}

$last_product_id = end($datas)['id'] ?? 0; 
0 голосов
/ 14 октября 2018

SELECT *, COUNT (product.id) AS 'count' ИЗ продукта ВНУТРЕННЕЕ СОЕДИНЕНИЕ product_category на product.product_category_id = product_category.id INNER JOIN company_manufacturer_product на product.company_manufacturer__product_id = группа продуктовproduct.id LIMIT 6 OFFSET 0;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...