从开发那里要来了一段 SQL,表示看不懂…… - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
KagamineLenKai2
V2EX    MySQL

从开发那里要来了一段 SQL,表示看不懂……

  •  
  •   KagamineLenKai2 2016-08-24 13:39:48 +08:00 5280 次点击
    这是一个创建于 3336 天前的主题,其中的信息可能已经有所发展或是发生改变。
    SELECT CASE a.send_underlying
    WHEN '1' THEN '已放标'
    WHEN '2' THEN '未放标'
    ELSE ''
    END
    AS isSendUnderlying,
    '' isSettleReloan,
    CASE a.is_ex_apply
    WHEN '1' THEN '新增'
    WHEN '2' THEN '展期'
    ELSE ''
    END
    AS isExApply,
    ad.marketing_manager AS marketingManager,
    ad.sales_name AS salesName,
    a.org_city_name AS orgCityName,
    c.contract_number AS contractNumber,
    a.product_name AS productName,
    a.client_name AS clientName,
    a.id_number AS idNumber,
    c.loan_amount AS loanAmount,
    cp.surplus_principal AS surplusPrincipal,
    CONCAT(a.loan_term, '-', cp.period) AS loanTerm,
    a.service_rates AS serviceRates,
    cp.front_service_charge AS frontServiceCharge,
    a.product_rates AS productRates,
    cp.amortized_interest AS amortizedInterest,
    cp.period_money AS periodMoney,
    CASE
    WHEN a.is_ex_apply = 1 AND cp.period = 0 THEN c.actual_amount
    ELSE ''
    END
    AS actualAmount,
    c.actual_loan_time AS actualLoanTime,
    <!-- CASE
    WHEN a.is_ex_apply = 2 AND cp.period = 0 THEN ctemp.minTime
    ELSE ''
    END
    AS minTime, -->
    case
    when a.is_ex_apply=1 and cp.period>1 then DATE_SUB(cp.repay_date,INTERVAL 30 Day)
    when a.is_ex_apply=2 then DATE_SUB(cp.repay_date ,INTERVAL 30 Day) else '--'
    end as minTime,
    cp.repay_date AS repayDate,
    cp.amortized_principal AS amortizedPrincipal,
    '' AS sjhkTime,
    '' AS actualPaymentAmount,
    '' AS actualSettlementAmount,
    CASE WHEN a.zExpStandar = 1 THEN ctemp.minTime ELSE '' END
    AS hgZqContinueExTime,
    '' AS oweBalance,
    '' AS defaultTime,
    '' AS defaultDays
    FROM contract_plan cp
    INNER JOIN apply a ON a.apply_id = cp.apply_id
    INNER JOIN apply_detail ad ON ad.apply_id = cp.apply_id
    INNER JOIN contract c ON c.apply_id = cp.apply_id
    LEFT JOIN
    ( SELECT min(cpt.repay_date) AS minTime,
    max(cpt.repay_date) AS maxTime,
    cpt.apply_id
    FROM contract_plan cpt
    GROUP BY cpt.apply_id) ctemp
    ON ctemp.apply_id = cp.apply_id
    INNER JOIN node_record n
    ON a.apply_id = n.apply_id
    AND n.node_code = 'END'
    AND n.is_in_node <![CDATA[<>]]> 1

    INNER JOIN node_record nr
    ON a.apply_id = nr.apply_id
    AND nr.node_code = 'loan'
    AND nr.status_code <![CDATA[>=]]> 10011200
    AND nr.status_code <![CDATA[<=]]> 10011700
    WHERE 1 = 1
    <isNotEmpty prepend="and" property="orgAuth">
    a.org_id in ($orgAuth$)
    </isNotEmpty>
    <isNotEmpty prepend="and" property="orgid">
    a.org_id =#orgid#
    </isNotEmpty>
    <isNotEmpty prepend="and" property="clientName">
    a.client_name =#clientName#
    </isNotEmpty>
    <isNotEmpty prepend="and" property="isExApply">
    a.is_ex_apply = #isExApply#
    </isNotEmpty>
    <isNotEmpty prepend="and" property="repayDateBegin">
    date_format(cp.repay_date,'%Y-%m-%d %h:%i:%s') <![CDATA[>=]]> #repayDateBegin#
    </isNotEmpty>
    <isNotEmpty prepend="and" property="repayDateEnd">
    date_format(cp.repay_date,'%Y-%m-%d %h:%i:%s') <![CDATA[<=]]> #repayDateEnd#
    </isNotEmpty>
    ORDER BY a.client_name, c.contract_number, cp.repay_date desc
    </select>

    只会 SELECT 、 FROM 、 INNER INTO 、 LIMIT 的弱鸡表示跪了……
    15 条回复    2017-05-16 17:40:57 +08:00
    KagamineLenKai2
        1
    KagamineLenKai2  
    OP
       2016-08-24 13:43:38 +08:00
    前半部分还好……函数什么的查一查也就知道用法了,不过结尾的那一串
    <isNotEmpty prepend="and" property="orgAuth">
    a.org_id in ($orgAuth$)
    </isNotEmpty>
    <isNotEmpty prepend="and" property="orgid">
    a.org_id =#orgid#
    </isNotEmpty>
    <isNotEmpty prepend="and" property="clientName">
    a.client_name =#clientName#
    </isNotEmpty>
    <isNotEmpty prepend="and" property="isExApply">
    a.is_ex_apply = #isExApply#
    </isNotEmpty>
    <isNotEmpty prepend="and" property="repayDateBegin">
    date_format(cp.repay_date,'%Y-%m-%d %h:%i:%s') <![CDATA[>=]]> #repayDateBegin#
    </isNotEmpty>
    <isNotEmpty prepend="and" property="repayDateEnd">
    date_format(cp.repay_date,'%Y-%m-%d %h:%i:%s') <![CDATA[<=]]> #repayDateEnd#
    </isNotEmpty>
    ORDER BY a.client_name, c.contract_number, cp.repay_date desc
    </select>

    这是 SQL 吗?
    woshihuzios123
        2
    woshihuzios123  
       2016-08-24 13:53:40 +08:00
    @KagamineLenKai2 百度了一下发现是 ibatis
    yanyuan2046
        3
    yanyuan2046  
       2016-08-24 13:54:55 +08:00
    看着像 P2P
    KagamineLenKai2
        4
    KagamineLenKai2  
    OP
       2016-08-24 13:56:44 +08:00
    @woshihuzios123 表示…还是不懂…
    est
        5
    est  
       2016-08-24 14:00:56 +08:00
    还行。。。请搜索 纯 SQL 实现 MD5 算法。
    Durandal01
        6
    Durandal01  
       2016-08-24 14:13:16 +08:00
    @KagamineLenKai2 这是 mybatis 配置文件里的写法,后面那段是拼接 SQL 用的。

    <isNotEmpty>里包着的部分表示在某个参数不为空( property 所指的参数)的情况下,加上这一段 SQL ,连接字用 prepend 里写的那个。

    举例说就是:

    <isNotEmpty prepend="and" property="orgAuth">
    a.org_id in ($orgAuth$)
    </isNotEmpty>

    表示 orgAuth 不为空 的情况下, SQL 语句里拼上 and a.org_id in 'orgAuth 的值'
    woshihuzios123
        7
    woshihuzios123  
       2016-08-24 14:58:38 +08:00
    @KagamineLenKai2 其实我也不懂,我只会 lambda
    lianyue
        8
    lianyue  
       2016-08-24 15:20:16 +08:00
    这 是我见过最长的 sql 查询 语句了
    daweilv
        9
    daweilv  
       2016-08-24 15:25:11 +08:00
    弱弱的问一下,这样的统计效率比放在程序里算高吗?
    oscarzhao
        10
    oscarzhao  
       2016-08-24 15:31:38 +08:00
    explain 一下看看性能如何
    server
        11
    server  
       2016-08-24 15:32:13 +08:00   1
    为了实现而实现,我死之后那管他洪水滔天。
    subpo
        12
    subpo  
    PRO
       2016-08-24 15:32:30 +08:00
    @daweilv 高太多了
    odirus
        13
    odirus  
       2016-08-24 15:33:14 +08:00
    @daweilv

    从单次查询来讲效率还可以,不过不利于后期优化,拆分成多个查询之后可以有针对性地进行缓存以及其他优化。
    8bit
        14
    8bit  
       2016-08-24 15:36:58 +08:00
    子查询比多次 Join 效率要高吧
    arist
        15
    arist  
       2017-05-16 17:40:57 +08:00
    以前做 BI 统计,dba 写单个统计点 SQL,每一项都是一页,大概有几百个统计项。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5844 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 03:23 PVG 11:23 LAX 20:23 JFK 23:23
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86