为了账号安全,请及时绑定邮箱和手机立即绑定

如何改进分页的 SQL 查询?

如何改进分页的 SQL 查询?

牛魔王的故事 2021-11-17 10:20:13
我正在处理数据库和 servlet,出现了这样的问题。我需要从每页 6 条的数据库中接收数据,为此我提出了这样的请求SELECT *, COUNT(*) AS 'count' FROM productINNER 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.idGROUP 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 响应:当我使用上述查询时,我的数据库响应,当我转到带有商品的第一页时,此请求将发送到数据库:当我翻到有商品的第二页时,我向数据库发送了这样一个请求SELECT * , COUNT(*) AS 'count' FROM product INNER JOIN product_category  on product.product_category_id = product_category.idINNER JOIN company_manufacturer_product   on product.company_manufacturer_product_id =      company_manufacturer_product.idGROUP BY 1 LIMIT 6 OFFSET 6;我有这样的回应:我不明白是什么问题。我必须通过 COUNT 使用请求!怎么证明?
查看完整描述

2 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

不反对这个问题的解决方法,按照上面的方法,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

而且,计数($ 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; 


查看完整回答
反对 回复 2021-11-17
?
桃花长相依

TA贡献1860条经验 获得超8个赞

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;

查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信