资讯专栏INFORMATION COLUMN

sequelize关联查询时的分页问题,join,limit

guyan0319 / 2420人阅读

摘要:我的解决方法是,在需要一对一关联的表中加入,这样就会将这个条件放在分页之前执行,方式运行时如下参数一般是指关联对象是外联还是内联,内联可以表示内联条件优先,分页在后。

用到许多数据库关系化映射中间件,hibernate,jpa,iBATIS,最近研究nodejs,发现一款不可多得的orm开源工具sequelize,支持promise,映射配置/查询/数据输出等都是json格式,非常顺心,官方文档很标准但完全说不透其强大的功能,很多都需要实际用到才能体会,就像json一样变化多端,你猜不透它有多少种变化。

好,下面来看一个需求案例:
一条这样的普通查询语句:

select * from product join producton product.id=place.productid and place.city=1100 where product.price>100 limit 10

用sequelize的query来写,如果写成这样:

models.product.findAll({
    where: ["price>=?", 100 ],
    include: [{
        model:models.product,
        where: { city:1100 }
    }],
    limit:12
})

实际上运行的sql是这个:

select product.*, place.* from (select * from product where product.price>100 limit 10) join place on product.id=place.productid and place.city=1100

想要的结果是错误的,分页时没有把city:1100 条件限制了,结果有差异,那怎么办?

于是找方法,看到有人使用加subQuery:false条件来处理,如下:

models.product.findAll({
    where: ["price>=?", 100 ],
    include: [{
        model:models.product,
        where: { city:1100 }
    }],
    limit:10,
    subQuery:false   //不让在子查询里分页,全局处理
})

这样对于只含一个include关联的查询倒是问题不大,如果include多个对象,关联的对象有1对多,多对多的关系,就不好控制了。

我的解决方法是,在需要一对一关联的表中加入required:true,这样就会将这个条件放在分页之前执行,

models.product.findAll({
    where: ["price>=?", 100 ],
    include: [{
        model:models.product,
        where: { city:1100 },
        required:true  //inner join方式
    }],
    limit:10,
})

运行时sql如下:

select product.*,place.* from product join place on product.id=place.productid and place.city=1100 where product.price>100 limit 10

required参数一般是指关联对象是外联还是内联,内联required=true可以表示内联条件优先,分页在后。
以上内容进仅供参考,使用场景不同,理解也不一样。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95467.html

相关文章

  • 你知道MySQL的Limit有性能问题

    摘要:问题对于小的偏移量,直接使用来查询没有什么问题,但随着数据量的增大,越往后分页,语句的偏移量就会越大,速度也会明显变慢。优化思想避免数据量大时扫描过多的记录解决子查询的分页方式或者分页方式。MySQL的分页查询通常通过limit来实现。 MySQL的limit基本用法很简单。limit接收1或2个整数型参数,如果是2个参数,第一个是指定第一个返回记录行的偏移量,第二个是返回记录行的最大数目。...

    Arno 评论0 收藏0
  • 4.2 数据库表/Sequelize Mysql-博客后端Api-NodeJs+Express+My

    功能梳理完了以后,咱们就可以开始数据库表设计了: 数据库表图: showImg(https://segmentfault.com/img/bVbr9GC?w=1922&h=1140); 首先打开Navicat Premium 创建数据库 blog 配置如下: showImg(https://segmentfault.com/img/bVbr81Y?w=720&h=352); 课前学习:1、Sequ...

    nicercode 评论0 收藏0
  • yii2 ActiveRecord多表关联以及多表关联搜索的实现

    摘要:今天把这个问题讲明白了,看看是怎么个多表关联以及如何去优化这个关联。现需要在列表展示表的来源渠道,且该渠道可搜索。关联表字段增加查询中的搜索模型也是通过实现的,该模型通过控制着哪个字段可搜索,哪个字段不可搜索。 作者:白狼 出处:http://www.manks.top/yii2_many_ar_relation_search.html 本文版权归作者,欢迎转载,但未经作者同意必须保留...

    venmos 评论0 收藏0

发表评论

0条评论

guyan0319

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<