如何改进分页的sql查询?

kjthegm6  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(296)

我正在处理数据库和servlet,出现了这样一个问题。我需要从数据库接收数据,每页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());
        }

我的数据库响应没有限制和偏移:

my database respone当我使用上述查询时,当我转到商品的第一页时,此请求将发送到数据库:

当我翻到商品的第二页时,我会向数据库发送这样一个请求

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;

我的React是:

我不明白问题是什么。我必须通过count使用请求!怎么证明?

hzbexzde

hzbexzde1#

选择*,count(product.id)作为“count”,从product inner join product\u category on product.product\u category\u id=product\u category.id inner join company\u manufacturer\u product.id=company\u manufacturer\u product.id group by product.id order by product.id limit 6 offset 0;

ftf50wuq

ftf50wuq2#

不反对这个问题的解决,按上述方法,加上 order by 使用原始sql可以解决这个问题。但是我认为我有一个更好的分页实践:使用参数,比如 has_more , last_product_id 以及 limit_num 将客户端与服务器连接。 has_more 指示服务器中的更多数据是否保留; last_product_id 表示最后一个响应数据的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;

相关问题