如何改进分页的 SQL 查询?

我正在处理数据库和 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());

        }

我的数据库没有 LIMIT 和 OFFSET 响应:

http://img3.mukewang.com/619466f500017bc814140215.jpg

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

http://img.mukewang.com/619467040001497f14120150.jpg

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


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;

我有这样的回应:

http://img3.mukewang.com/619467110001b51914120091.jpg

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


牛魔王的故事
浏览 143回答 2
2回答

红糖糍粑

不反对这个问题的解决方法,按照上面的方法,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 desclimit $limit_num + 1; =>$datas而且,计数($ DATAS)和$ limit_num计算的价值has_more和last_product_id:$has_more = 0;$data_num = count($datas);if ($data_num > $page_limit) {&nbsp; &nbsp; $has_more = 1;&nbsp; &nbsp; array_pop($datas);&nbsp; &nbsp; $data_num--;}$last_product_id = end($datas)['id'] ?? 0;&nbsp;

桃花长相依

SELECT *, COUNT(product.id) 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 product.id OFF SET 6 0;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java