tp5 使用buildSql、union


如題,SQL語句是這樣的,如下所示,不用管表里內容是什么,只要知道wygl_sfgl_mxb根據條件查詢出的結果與wygl_sfgl_sjjz表根據條件查出來的結果作為a表,再與b表c表左聯然后再根據條件查詢需要的數據,也不難,但是咱之前沒這么搞過啊~~~,再說table里也不能寫(SELECT yf,sfxmbh,xqh,sl,je,0 AS hs FROM wygl_sfgl_mxb WHERE je > 0 UNION ALL SELECT yf,sfxmbh,xqh,sl,je,1 AS hs FROM wygl_sfgl_sjjz WHERE je > 0)啊,寫上會報錯,我試過了~原生查詢也不是不行,就是那么一大坨,看着就惡心,而且還要分頁,SQL server的分頁到現在也沒弄明白怎么回事,我也不想弄明白~~~最后在度娘的領導下,經過CSDN,博客園的不懈努力………,終於,找到了正確的寫法,如下

$sql1 = Db::connect($this->config)->table('wygl_sfgl_mxb')->field('yf,sfxmbh,xqh,sl,je,0 AS hs')->where('je', '>','0')->buildSql();
        $sql3 = Db::connect($this->config)->table('wygl_sfgl_sjjz')->field('yf,sfxmbh,xqh,sl,je,1 AS hs')->where('je','>','0')->union([$sql1])->buildSql();
        $res = Db::connect($this->config)
            ->table($sql3)
            ->alias('a')
            ->leftJoin('wygl_sfxm b','a.sfxmbh= b.dm')
            ->leftJoin('sys_qx_sjqx qx','a.xqh= qx.xmdm')
            ->field('a.yf,a.sfxmbh,b.mc,COUNT ( 1 ) AS yshs,SUM ( a.sl ) AS yssl,SUM ( a.je ) AS ysje,SUM ( a.hs ) AS yishs,SUM ( a.hs* a.sl ) yissl,SUM ( a.hs* a.je ) AS yisje,SUM ( a.hs- 1 ) * ( - 1 ) AS wshs,SUM ( ( a.hs- 1 ) * a.sl ) * ( - 1 ) AS wssl,SUM ( ( a.hs- 1 ) * a.je ) * ( - 1 ) AS wsje ')
            ->where($map)
            ->group('a.yf ,a.sfxmbh,b.mc')
            ->order(["yf"=>"desc","sfxmbh","mc"])
            ->paginate(20);

上面是解決的tp5寫法,下面是原始SQL語句,數據庫背景是SQL server。

SELECT TOP
    100 a.yf,
    b.mc,
    COUNT ( 1 ) AS yshs,
    SUM ( a.sl ) AS yssl,
    SUM ( a.je ) AS ysje,
    SUM ( a.hs ) AS yishs,
    SUM ( a.hs* a.sl ) yissl,
    SUM ( a.hs* a.je ) AS yisje,
    SUM ( a.hs- 1 ) * ( - 1 ) AS wshs,
    SUM ( ( a.hs- 1 ) * a.sl ) * ( - 1 ) AS wssl,
    SUM ( ( a.hs- 1 ) * a.je ) * ( - 1 ) AS wsje 
FROM
    (SELECT yf,sfxmbh,xqh,sl,je,0 AS hs FROM wygl_sfgl_mxb WHERE je > 0 UNION ALL SELECT yf,sfxmbh,xqh,sl,je,1 AS hs FROM wygl_sfgl_sjjz WHERE je > 0 ) a
    LEFT OUTER JOIN wygl_sfxm b ON a.sfxmbh= b.dm
    LEFT OUTER JOIN sys_qx_sjqx qx ON a.xqh= qx.xmdm 
WHERE
    a.yf>= '19700101' 
    AND a.yf <= '20200917' 
    AND qx.flag= 1 
    AND qx.dm= '1003' 
GROUP BY
    a.yf ,
    a.sfxmbh,
    b.mc 
ORDER BY
    a.yf DESC,
    a.sfxmbh,
    b.mc


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM