Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 997|回复: 0

laravel4.2 union联合,join关联分组查询最新记录时,查询条件不对,解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-7-4 13:12:45 | 显示全部楼层 |阅读模式

    需求: 分组联合查询,或者最新记录。 

    问题:  mysql分组的时候默认会查询第一条记录,存在gourp by时 order by 无效。 一般解决办法就是 ,select * from ( select * from order by id) group by 。 因为项目实际中 查询规则复杂,需要使用到  union 联合查询, 另外和关联查询,在 laravel4.2中 如果关联join 多条件时,在union 会出现 最后的结果集不正确。问题是出现在,laravel最后生成 where 表达式时不对。

    执行 最后 sql : 

    SELECT
        *
    FROM
        (
            (
                SELECT
                    id
                FROM
                    table_a
                JOIN table_b ON table_a.id = table_b.t_id (AND table_b.x_id =  1)
                WHERE
                    id =2
            )
            UNION
                (
                    SELECT
                        id
                    FROM
                        table_c
                    JOIN table_d ON table_c.id = table_d.t_id (AND table_c.x_id =  3)
                    WHERE
                        id = 4
                )
        ) AS t
    GROUP BY id

     

    正确解析应该时表达式数组是  [ 1,2,3,4]  ,实际查询laravel 表达式时  结果为[ 1,1,2,3,3,4](忘记,具体是几个,但是会出现1 和 3 出现多次是真实出现的)

    $model_a = DB::table( 'table_a' )->select( 'id' )->join( 'table_b' , function( $query ){
    	$query->on( 'table_b.a_id' , '=' , 'table_a.id' )
    	->where( 'table_b.x_id' , 1)
    })->where( 'id' , 2 )->orderBy('time','desc'); 
     
    $model_b = DB::table( 'table_c' )->select( 'id' )->join( 'table_d' , function( $query ){ 
        $query->on( 'table_c.c_id' , '=' , 'table_d.id' )
        ->where( 'table_c.x_id' , 3);
    })
    ->where( 'id' , 4 )
    ->orderBy('time','desc');
    

       

    $result = $model_b->union( $model_a );
    $data = DB::table( DB::raw("($result->toSql() ) as t"))->mergeBindings( $result->getBindings() )->groupBy( 'id' )->get();

      

    个人解决方案: 1.

          获取2个model表达式的 查询条件 $model_a->getBindings();   结果位  [1,2]

          $model_b->getBindings();   结果位  [3,4]

    $data = DB::table( DB::raw("($result->toSql() ) as t"))->setBindings(array_merge($model_a->getBindings(),$model_b->getBindings())->groupBy( 'id' )->get();

     

          2. 使用源生sql方式解决。

        

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 13:10 , Processed in 0.056973 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表