美文网首页
mysql 两张不同结构的表连表查询,合并,并分页,排序 教你如

mysql 两张不同结构的表连表查询,合并,并分页,排序 教你如

作者: 徐猿猿 | 来源:发表于2021-12-29 16:50 被阅读0次

     MySQL用union把两张没有关联的表合并,并使用条件查询排序分页

     场景应用:

    类似某团的搜索,既可以搜索店铺,也可以搜索商品;

    类似某名片的搜索,既可以搜索企业,也可以搜索名片;

     实现:

    我用下面在laravel中实现的代码案例说下:

    $test1= UserHistoryCompany::orWhere(function ($query) use($title) {

                $query->where('user_history_company.user_id', '=', $this->user_id)->where('is_delete',0)

                    ->where('company.name', 'like', '%'.$title.'%');

            })

                ->join('company','company.id','=','user_history_company.company_id')

                ->select('user_history_company.id','user_history_company.user_id','user_history_company.company_id as c_id',

                    'user_history_company.updated_at','company.name as company_name','company.id as company_id','logo',

                    DB::raw('2 as type , 0 as card_id , 0 as head_img , 0 as job_name , 0 as department_name , 0 as name '));

            $result= UserHistoryCard::orWhere(function ($query) use($title) {

                $query->where('user_history_card.user_id', '=', $this->user_id)->where('is_delete',0)

                    ->where('company.name', 'like', '%'.$title.'%');

            })

                ->orWhere(function ($query) use($title) {

                    $query->where('user_history_card.user_id', '=', $this->user_id)->where('is_delete',0)

                        ->where('card.name', 'like', '%'.$title.'%');

                })

                ->orWhere(function ($query) use($title) {

                    $query->where('user_history_card.user_id', '=', $this->user_id)->where('is_delete',0)

                        ->where('card.mobile', 'like', '%'.$title.'%');

                })

                ->join('card','card.id','=','user_history_card.card_id')

                ->join('company','company.id','=','card.company_id')

                ->select('user_history_card.id','user_history_card.user_id','user_history_card.card_id as c_id',

                    'user_history_card.updated_at','company.name as company_name','company.id as company_id','logo',

                    DB::raw('1 as type , user_history_card.card_id , card.head_img , card.job_name , card.department_name , card.name '))

                ->unionAll($test1);

            $sql = $result->toSql();

            $result = DB::table(DB::raw("($sql) as a "))

                ->mergeBindings($result->getQuery())

                ->orderBy('updated_at', 'desc')

                ->paginate(request()->input('page_num') ?? 50);

              dd($result);

    什么 ?上面的看不懂?好吧,我简单列下:

    1.当两张表属性完全相同时,可以直接合并(union会删除重复数据,union all会返回所有结果集)

    (1)将两个表合并

            select * from 表1

            union

            select * from 表2

            select * from 表1

            union all

            select * from 表2

    (2)将两个表合并,并使用条件查询

        select * from ( select * from 表1

        union select * from 表2)

        as 新表名

        where 条件1 and 条件2

    2、当两个表的属性不同时,要分别查询每个属性,给不同属性名取一个别名,例如收入和支出表:(表中的id和remark是相同属性名,其他的属性名都不同)

    select * from(

    (select id,

    a1 as a,

    b1 as b,

    c1 as c,

    d1  as d,

    e1 as e,

    updated_at

    from a1_table)

    union all

    (select id,

    a2 as a,

    b2 as b,

    c2 as c,

    d2  as d,

    e2 as e,

    updated_at

    from a2_table)

    ) as c

    温馨提示:

    坑1:虽然2个表结构要整合再一起排序分页,就要通过 as 别名来转换相同的字段,不然就被最后一个查询条件的字段给覆盖了,

    坑2:上面的a1,b1,c1 顺序要对着a2,b2,c2,才行,否则就被最后一个查询条件的字段给覆盖了,

    错误示范:

    1,a1,b1,c1 顺序要对着c2,b2,a2,你查询出来的a1值就会到c2里面,c1到a2里面,不信你可以试试。

    坑3:2个查询字段数量必须一致,否则就会报错。

    完事了,比较懒,想看详情的话,看下面2个链接,前人写的

    ————————————————

    参考链接:https://blog.csdn.net/qq_43341807/article/details/120115151

    参考链接:https://www.cnblogs.com/zhengchuzhou/p/10262260.html

    相关文章

      网友评论

          本文标题:mysql 两张不同结构的表连表查询,合并,并分页,排序 教你如

          本文链接:https://www.haomeiwen.com/subject/knovqrtx.html