精华内容
下载资源
问答
  • Mysql 关联查询where条件

    千次阅读 2015-12-24 21:44:17
    通常,关联查询时候,把where放在关联条件on之后。但是数据量比较大的时候,有时候性能很低。...如果可以把where放在内表里,尽量放在内表里,尤其是主表里,大数据量的时候可以提高很多查询时间。


    通常,关联查询时候,把where放在关联条件on之后。但是数据量比较大的时候,有时候性能很低。

    如果可以把where放在内表里,尽量放在内表里,尤其是主表里,大数据量的时候可以提高很多查询时间。


    展开全文
  • //指定查询字段 ->with(['certifications'=>function($a){ //certifications是关联的模型名 $a->where('status',1)->select('user_id','status... //user_id 是两个表的关联键,即使不查询user_id 也...
    //指定查询字段
    
       ->with(['certifications'=>function($a){   //certifications是关联的模型名
                    $a->where('status',1)->select('user_id','status');        //user_id   是两个表的关联键,即使不查询user_id 也要把user_id 查询出来
                }])
             
    
    //where关联条件
       ->when($by_income, function ($query) use ($by_income) {                                     //when 方法
                     $query->whereHas('incomeuser', function ($query) use ($by_income) {      //whereHas       //incomeuser是关联的模型名
                         $query->where('by_income',$by_income);
                    });
                })
    
    //sum 关联求和
     ->with(['incomedetails'=>function($d){
                    $d->groupBy('user_id')->whereIn('income_type',['recharge','viprecharge','srecharge'])
                    ->selectraw('user_id ,sum(income) as recharge_income');
                }])
    
    展开全文
  • 数据库在通过连接两张或张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下: 1、 on条件是在生成临时表时使用的条件,它不管on中的条件...

    先说明原因:

    优化的本质就是(join on 和where的执行顺序)

    关键字: on

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

    在使用left jion时,on和where条件的区别如下:

    1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    假设有两张表:

    表1:tab2

    idsize
    110
    220
    330

    表2:tab2

    sizename
    10AAA
    20BBB
    20CCC

    两条SQL:
    1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
    2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)

    第一条SQL的过程:

     

    1、中间表
    on条件:
    tab1.size = tab2.size
    tab1.idtab1.sizetab2.sizetab2.name
    11010AAA
    22020BBB
    22020CCC
    330(null)(null)

     

      
    2、再对中间表过滤
    where 条件:
    tab2.name=’AAA’
    tab1.idtab1.sizetab2.sizetab2.name
    11010AAA

     

      

     

    第二条SQL的过程:

     

    1、中间表
    on条件:
    tab1.size = tab2.size and tab2.name=’AAA’
    (条件不为真也会返回左表中的记录)
    tab1.idtab1.sizetab2.sizetab2.name
    11010AAA
    220(null)(null)
    330(null)(null)

     

     


    实战练习

    1.首先先建立两个表

    create table table1
    (
      mon varchar2(14),
      dep number(4),
      yj number(4)
    )
    insert into table1 values ('一月份',1,10);
    insert into table1 values ('一月份',2,10);
    insert into table1 values ('一月份',3,5);
    insert into table1 values ('二月份',2,8);
    insert into table1 values ('二月份',4,9);
    insert into table1 values ('二月份',3,8);
    
    create table table2
    (
      dep number(4),
      dname varchar2(30)
    )
    
    insert into table2 values(1,'国内业务一部');
    insert into table2 values(2,'国内业务二部');
    insert into table2 values(3,'国内业务三部');
    insert into table2 values(4,'国际业务部');

    2.要求查出每个部门一月份,二月份的业绩

    查出结果如下


    3 用以下where语句增加最后的过滤条件在特定场景下肯定是可以的 (但是鉴于这里是要1~4月全部展示,所以where子句还是不符合条件,在这里列出是为了说明where是在on条件执行之后增加过滤条件)

    select t0.dep as dep,t0.dname as 部门名称 , t1.yj as 一月份业绩 , t2.yj as 二月份业绩
    from table2 t0
      left join  table1 t1 on  t0.dep=t1.dep
      left join table1 t2 on  t0.dep=t2.dep
    where t1.mon='一月份' and t2.mon='二月份'
    order by t0.dep

    4. 接下来把where条件去掉看查出来的数据有10条,可以发现这其中没有 t1.mon='一月份' and t2.mon='二月份'的限定条件,

        table2表的国际业务一部 (dep=1)与 table1表的一月份(dep=1)的业绩为10(yj=10) 匹配2次,分别匹配出一条一月份的业绩和二月份的业绩 ,因为国际业务一部二月份么有业绩,所以这明显是错误的匹配 (增加了额外的中间表数量)

    5. 如果能在匹配之前先对应加上t1.mon='一月份' 或者  t2.mon='二月份'的限定条件,如果没有满足限定条件,后面的t0.dep=t1.dep就不会执行,这样就会至少在中间表中会少一条数据, 假如再使用where过滤就会减少过滤操作数量

    select t0.dep as dep,t0.dname as 部门名称 , t1.yj as 一月份业绩 , t2.yj as 二月份业绩
    from table2 t0
      left join  table1 t1 on t1.mon='一月份' and t0.dep=t1.dep
      left join table1 t2 on t2.mon='二月份' and t0.dep=t2.dep
    order by t0.dep

      


    参考文章:https://www.cnblogs.com/wlzhang/p/4532587.html

    另附 提高SQL查询效率的30种方法 传送门

    https://www.cnblogs.com/lykbk/p/aefweere45454545454.html

    展开全文
  • Eloquent 的 whereHas 加个 where in 的优化)给Eloquent的whereHas方法进行性能优化,因为这篇文章里面提供的代码还是有些细节问题,并不能支持所有的关联关系,所以我抽空写了这个扩展包,支持了所有关联关系。...

    前言

    前几天在QQ群里看到有位同学请人帮忙根据社区里的文章(给 Eloquent 的 whereHas 加个 where in 的优化)给EloquentwhereHas方法进行性能优化,因为这篇文章里面提供的代码还是有些细节问题,并不能支持所有的关联关系,所以我抽空写了这个扩展包,支持了所有关联关系。并且我也做了一些小测试,发现在数据量大的情况下优化过后的性能提升非常惊人,下面是一个简单的测试,如果有不正确之处欢迎大家拍砖指正:

    主表test_users写入130002条数据,关联表test_user_profiles写入1002条数据,查询代码如下

    <?php
    /**
     * 未优化sql
     * 
     * select * from `test_users` where exists
     *   (
     *     select * from `test_user_profiles` 
     *     where `test_users`.`id` = `test_user_profiles`.`user_id`
     *  ) 
     * limit 10
     */
    $users1 = User::whereHas('profile')->limit(10)->get();
    
    /**
     * 优化后的sql
     * 
     * select * from `test_users` where `test_users`.`id` in 
     *   (
     *     select `test_user_profiles`.`user_id` from `test_user_profiles` 
     *     where `test_users`.`id` = `test_user_profiles`.`user_id`
     *   ) 
     * limit 10
     */
    $users1 = User::whereHasIn('profile')->limit(10)->get();
    

    最终耗时如下,可以看出性能相差还是不小的,如果数据量更多一些,这个差距还会更大

    whereHas (优化前)   0.50499701499939 秒
    whereHasIn (优化后) 0.027166843414307 秒
    

    多测试几次之后不难发现:

    当主表数据量较多的情况下,where id in会有明显的性能提升;当主表数据量较少的时候,两者性能相差无几。

    简介

    Laravel wherehasin是一个可以提升Laravel ORM关联关系查询性能的扩展包,可以替代Laravel ORM中的whereHas以及whereHasMorphIn查询方法。

    Github (如果喜欢这个项目不妨点个star,谢谢支持~)

    环境

    • PHP >= 7
    • laravel >= 5.5

    安装

    composer require dcat/laravel-wherehasin
    

    使用

    whereHasIn

    此方法已支持Laravel ORM中的所有关联关系,可以替代whereHas

    User::whereHasIn('profile')->get();
    
    User::whereHasIn('profile', function ($q) {
        $q->where('id', '>', 10);
    })->get();
    

    orWhereHasIn

    User::where('name', 'like', '%laravel%')->orWhereHasIn('profile')->get();
    

    多级关联关系

    User::whereHasIn('painters.paintings', function ($q) {
        $q->whereIn('id', [600, 601]);
    })->orderBy('id')->get()->toArray();
    

    需要注意的是,如果是BelongsTo类型的关联关系,使用whereHasIn时使用的不是主键,而是外键

    <?php
    
    /**
     * 这里用的是"user_id in",而不是"id in"
     * 
     * select * from `test_user_profiles` where `test_user_profiles`.`user_id` in 
     *   (
     *     select `test_users`.`id` from `test_users` where `test_user_profiles`.`user_id` = `test_users`.`id`
     *   )
     */
    $profiles = Profile::whereHasIn('user')->get();
    

    whereHasMorphIn

    此方法已支持Laravel ORM中的所有关联关系,可以替代whereHasMorph

    Image::whereHasMorphIn('imageable', Post::class, function ($q) {
        $q->where('id', '>', 10);
    })->get();
    

    鸣谢

    给 Eloquent 的 whereHas 加个 where in 的优化

    展开全文
  • Spring Data Mongodb关联查询

    万次阅读 2018-12-27 16:19:29
    Spring Data Mongodb使用$lookup实现关联查询Spring Data Mongodb关联查询前言一、实例1、数据准备2、 一对一:两表关联查询3、一对一:关联查询4、一对关联查询二、讲道理1、自定义...
  • MySQL查询where查询

    千次阅读 2019-05-31 21:49:32
    SQL不仅支持单条的检索数据查询还允许创建子查询,即嵌套在其他查询中的查询。 表结构:https://blog.csdn.net/wsdfym/article/details/90722724 当前有用户表,以及订单表,订单详细表时,需要查询购买了某商品Id为...
  • mysql查询语句 和 关联查询 以及 子查询

    万次阅读 多人点赞 2017-03-28 14:12:15
    mysql(三):mysql查询语句 和 关联查询 以及 子查询 1.查询一张表:  select * from 表名; 2.查询指定字段:select 字段1,字段2,字段3….from 表名; 3.where条件查询:select 字段1,字段2,字段3 ...
  • Eggjs Sequelize 关联查询

    千次阅读 2020-07-03 16:35:50
    对于简单的 增、删、改、查 新手的我也是快速上手了,但是当我遇到需要关联其他表查询时,我就懵逼了,不知道怎么关联啊。几经周折,总算搞明白了,特此记录一下~~~ 实现:通过 fdc_vd_user_his 表关联外键,查询 ...
  • TP5.1多关联添加查询条件

    千次阅读 2019-08-06 11:36:37
    前提:需要做RBAC模型权限设计,涉及到角色表(role)、权限表(rule)、角色权限表(role_rule),使用的是tp5.1,想要用tp自带的模型多关联查询。 在RoleModel中定义了多关联: //多关联 public ...
  • 刚开始用left join是总是傻傻分不清楚筛选条件到底该放在on之后还是where之后,这里我们先说原理再通过例子方便大家理解 使用left join时,原理简单的可以描述为先将左边的主表结果集查询出来,然后遍历主表结果集...
  • 关系的关联查询

    万次阅读 多人点赞 2017-11-23 19:14:20
    笔者根据实际的业务和参考网上的处理方法,现在做如下处理,由于笔者技术水平有限,错误之所,在所难免,敬请各位技术大佬批评和指正
  • mysql查询 3.关联查询

    千次阅读 2018-07-26 23:28:38
    关联查询 使用的数据库为mysql查询 2.建立表数据库案例中的数据库。 1.1内连接查询 使用内连接查询,只有满足条件的结果才会显示。 1)内连接(第一种语法) select i.name,b.class,s.python from scores ...
  • MyBatis实现一对一,一对多关联查询

    万次阅读 多人点赞 2019-09-25 00:20:31
    MyBatis如何实现一对一,一对多查询的? 可以通过关联查询实现。关联查询是几个表联合查询,只查询一次,通过在resultMap里面的association,collection节点配置一对一,一对多的类就可以完成 具体实现如下 准备...
  • MongoDB的关联查询

    万次阅读 2017-11-10 18:31:59
    Mongoose的关联查询 首先,我们回忆一下,MySQL关联查询的语句: student表: calss表: 通过student的classId关联进行查询学生名称,班级的数据: SELECT student.name,student.age,class.name ...
  • SQL两表关联查询where条件中等号两端字段顺序对效率的影响   现有两表A(大)、B(小)作关联查询,SQL语句如下:   SQL1:select * from A,B where A.id = B.id   SQL2:select * from A,B where B.id = A.id ...
  • TP6模型多关联查询

    千次阅读 2021-02-03 11:05:55
    User模型 class User extends Model { public function roles() ...多关联查询 // User表查询条件 $map=[]; // Role表查询条件 $where=[]; $data = User::with('roles'=>function($query) use($whe
  • 用了这么就得solr也知道了solr的适用性在哪,它不适合于异常复杂的数据组合,就比如表与表是的关系,适用于表结构比较简单,或者说查询的数据结构比较简单,而数据量特别的大特别的大,检索的条件也是非常的...
  • TP5 hasMany一对多关联查询

    千次阅读 2019-12-18 17:39:20
    下面是一个查询用户登录历史的功能(简单的结构,为了解释一对多关联查询) 有2张表 ...下面先附上一对多查询结果的数组样式 下面上代码(model层) public function userLoginLog() { ...
  • mybatis实现多对多关联查询XML实现 ​ 在开发过程中,持久层架mybatis为我们封装了SQL操作,只需要提供...​ 这里我们以多对多查询为例:下面代码中一部电影可以属于多个分类,一个分类下又可以存在多部电影,这种...
  • MySQL关联查询+子查询_R

    千次阅读 2017-03-16 13:55:36
    MySQL关联查询+子查询 -- **************关联查询查询)****************-- 查询规则:1)确定查询哪些表。 2)确定哪些字段。 3)表与表之间连接关系(规律:连接条件数量=表数量-1)。-- ***1.交叉...
  • Spring Data JPA Specification关联查询

    万次阅读 2020-10-23 17:17:59
    需求:有一个流量计的设备,流量计有一个所属罐区id,想要通过所属罐区查到所关联的这个罐区的编码以及名称。 1.流量计实体类: 主要是给流量计实体添加了以下属性,通过tank_area_id关联: package ...
  • jpa关联条件查询实现

    千次阅读 2020-12-23 14:32:59
    通过实体类映射实现关联条件查询 jpa对于关联可以在实体类中进行关联映射,一对一用@OneToOne,一对多用@OneToMany,对多用@ManyToMany,对一用@ManyToOne,具体实体类配置就不说了,然后对于条件查询...
  • MySQL关联查询优化

    千次阅读 2019-11-28 10:37:20
    最近在对运营报表导出进行优化,总结了一些关联查询优化的点记录一下。 避免临时表 通过 Explain 分析 SQL 语句,尽量不要使用到临时表。GROUP BY (Explain具体详解,可以看这篇博客) 最容易造成使用临时表,...
  • Hibernate多关联和非关联查询

    千次阅读 2013-05-13 16:02:02
    对象:用户、用户组 ...关联查询查询指定用户组下的所有用户 方式一: select User from User User join User.groups g where g.id = 1 hibernate解析成以下SQL Hibernate:   select  user0_.id
  • SQL关联查询

    千次阅读 2019-09-19 09:26:01
    有时候,我们查询数据时,会采用数据库关联查询的方式。数据库通过连接两张表或张表查询时,会生成一张临时的中间表,然后返回给用户的就是这张临时表的数据。那么具体怎么操作呢?我们可以采用left join,搭配...
  • 1.1 一对多查询 案例:查询所有订单信息及订单下的订单明细信息。 订单信息与订单明细为一对多关系。 使用resultMap实现如下: 1.1.1 Sql语句:三张表的关联查询 标红的分别为查询字段,查询的表,关联查询的条件 ...
  • MySQL关联查询

    万次阅读 多人点赞 2018-01-27 15:01:35
    SQL 连接(JOIN) 子句用于把来自两个或个表的行结合起来,基于这些表之间的共同字段。连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表。左连接与右连接的左右指的是以两张表中的哪一张为基准,它们...
  • Mybatis关联查询之一对对一XML配置详解

    万次阅读 多人点赞 2017-12-21 10:53:05
    平时在开发过程中dao、bean和XML文件都是自动生成的,很少写XML的配置关系,今天记录一下mybatis的关联查询中的对一和一对的情况。 首先是有两张表(学生表Student和老师Teacher表),为了更易懂,这里只设置了...
  • MyBatis之一对多关联查询

    万次阅读 2017-03-09 09:57:26
    MyBatis一对多关联
  • mybatis使用注解实现一对多关联查询

    千次阅读 2019-06-04 14:15:48
    mybatis使用注解实现一对多关联查询 @Select("select id,mockexam_section as section,id as sectionId" + " from t_p_qb_mockexam_section" + " where mockexam_charpter_id = #{charpterId} and is_delet....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 270,968
精华内容 108,387
关键字:

多关联where查询