mysql遇到的问题总结(二)

前言

  改了好多sql,认识了几个新的函数,总结一下。

问题

1.

  sql拼接问题

  示例:

${if(len(enddate)==0,"","and ( date_format(transport.DISCHARGE_DATE_START, '%Y-%m') ='"+enddate+"' or date_format(transport.DISCHARGE_DATE_END, '%Y-%m') ='"+enddate+"')")}

  transport.DISCHARGE_DATE_START是日期时间类型;enddate的格式是”2018-03”

  最开始enddate也做了date_format转换,怕界面上传过来的参数有变动,但是一直出错。

  原因是:sql语句中可以用date_format函数,但是穿过来的参数不能使用这个函数,参数知识拼接进sql,没有语言执行它的转换函数。

  解决方法:就是上面的,数据库中的字段做了日期格式转换,界面上的参数没有做

8.

  exists

  示例片段:

扫描二维码关注公众号,回复: 582653 查看本文章
WHERE

                    br.ALIVE_FLAG = '1'

                AND EXISTS (

                    SELECT

                        1

                    FROM

                        t_cms_info ci

                    WHERE

                        ci.ALIVE_FLAG = '1'

                    AND ci.ID = br.INFORMATION_ID

                    AND ci.EXTEND3 = 'month'

                    AND ci.EXTEND10 = 'zh'

                )

  exists的返回值true 或者 false, 扫面符合where条件的就exists就为true

9.

  format

  示例:

FORMAT(goods.QUANTITY, 0) AS "数量(桶)"    0位小数,整数

FORMAT(max(statement.SETTLEMENT_PRICE), 3) 3位小数

10.

  dateformat

  函数:

date_format(NOW(), '%Y%U')   当前时间是第几周

date_format(NOW(), '%Y%m%d')   年月日

date_format(NOW(), '%Y%m') 年月

  示例:

${if(len(pstartdate)==0,"","and  date_format(CREATE_DATE,'%Y-%m-%d') between'"+pstartdate+"'and '"+penddate +"'")}

  between and 是可以去到区间边界的值的,但是CREATE_DATE是一个日期时间类型,pstartdate和penddate 都是日期类型,日期类型默认的时间都是0点,只要时间不是00:00:00都查不出区间的边界时间,所以统一了格式

11.

  订单执行实例left join

  示例:


SELECT

    od.ORDER_NO AS "订单编号",

    od.CREATE_DATE AS "订单时间",

    od.BUYER_CUSTOMER_NAME AS "买方",

    od.SELLER_CUSTOMER_NAME AS "卖方",

    goods.EN_NAME AS "品种",

    price.TRADE_TERM AS "贸易条款",

    FORMAT(goods.QUANTITY, 0) AS "数量(桶)",

    CONCAT(

        '+/-',

        FORMAT(goods.MORE_LESS, 0),

        '%'

    ) AS "溢短装",

    ship.`NAME` AS "船名",

    group_concat(transport.LOADING_PORT) AS "装货港",

    CONCAT(

        transport.DELIVERY_DATE_START,

        '至',

        transport.DELIVERY_DATE_END

    ) AS "装期",

    group_concat(transport.UPLOADING_PORT) AS "卸货港",

    CONCAT(

        transport.DISCHARGE_DATE_START,

        '至',

        transport.DISCHARGE_DATE_END

    ) AS "卸货期",

    group_concat(loading.BL_DATE) AS "提单日",

    group_concat(

        FORMAT(loading.BL_NIGHTSTOOL, 0)

    ) AS "提单量",

    group_concat(

        FORMAT(unloading.POT_HAIR_BAR, 0)

    ) AS "卸货量",

    group_concat(

        FORMAT(

            unloading.BL_HAIR_BAR_RATE,

            0

        )

    ) AS "(O-P)%",

    CONCAT('$',IFNULL((select FORMAT(max(statement.SETTLEMENT_PRICE), 3) from t_order_statement statement where od.ID = statement.ORDER_ID and statement.STATEMENT_TYPE = '2' and statement.alive_flag = '1'),

  (select FORMAT(max(statement.SETTLEMENT_PRICE), 3) from t_order_statement statement where od.ID = statement.ORDER_ID and statement.STATEMENT_TYPE = '1' and statement.alive_flag = '1'))) AS "结算价格",

    CASE od.`STATUS`

WHEN '05' THEN

    '已成交'

WHEN '10' THEN

    '已租船'

WHEN '15' THEN

    '已装船'

WHEN '20' THEN

    '已到港'

WHEN '25' THEN

    '已卸货'

WHEN '30' THEN

    '已对账'

WHEN '35' THEN

    '已收款'

WHEN '00' THEN

    '已取消'

END AS "状态"

FROM

    t_order od

LEFT JOIN t_order_goods goods ON od.ID = goods.ORDER_ID 

LEFT JOIN t_order_price price ON od.ID = price.ORDER_ID

LEFT JOIN t_order_ship ship ON od.ID = ship.ORDER_ID

LEFT JOIN t_order_transport transport ON od.ID = transport.ORDER_ID

LEFT JOIN t_order_ship_loadinginfo loading ON od.ORDER_NO = loading.ORDER_NO

LEFT JOIN t_order_ship_unloadinginfo unloading ON od.ORDER_NO = unloading.ORDER_NO

WHERE

    od.ALIVE_FLAG = '1'

AND goods.ALIVE_FLAG = '1'

AND IFNULL(price.ALIVE_FLAG, '1') = '1'

AND IFNULL(ship.ALIVE_FLAG, '1') = '1'

AND IFNULL(transport.ALIVE_FLAG, '1') = '1'

AND IFNULL(loading.ALIVE_FLAG, '1') = '1'

AND IFNULL(unloading.ALIVE_FLAG, '1') = '1'



${if(len(startdate)==0,"","and ( date_format(transport.DELIVERY_DATE_START, '%Y-%m') ='"+startdate+"' or date_format(transport.DELIVERY_DATE_END, '%Y-%m') ='"+startdate+"')")}



${if(len(enddate)==0,"","and ( date_format(transport.DISCHARGE_DATE_START, '%Y-%m') ='"+enddate+"' or date_format(transport.DISCHARGE_DATE_END, '%Y-%m') ='"+enddate+"')")}

${if(len(loadingPort)==0,"","and transport.LOADING_PORT ='"+loadingPort+"'")}

${if(len(unloadingPort)==0,"","and transport.UPLOADING_PORT ='"+unloadingPort+"'")}

${if(len(shipName)==0,"","and ship.`NAME` ='"+shipName+"'")}

${if(len(buyer)==0,"","and od.BUYER_CUSTOMER_NAME ='"+buyer+"'")}

${if(len(seller)==0,"","and od.SELLER_CUSTOMER_NAME ='"+seller+"'")}

${if(len(moreOrLess)==0,"","and group_concat(

        FORMAT(

            unloading.BL_HAIR_BAR_RATE,

            0

        )

    ) ='"+moreOrLess+"'")}

${if(len(state)==0,"","and od.`STATUS` ='"+state+"'")}

${if(len(tradeTerm)==0,"","and price.TRADE_TERM ='"+tradeTerm+"'")}



GROUP BY

    od.ID;

12.
  资讯实例 union

select name as "频道名称", monthBrowse as "本月浏览量"

from

(SELECT

    cs.CHANNEL_NAME AS name,

    (

        SELECT

            COUNT(br.ID)

        FROM

            t_cms_browsing_record br

        WHERE

            br.ALIVE_FLAG = '1'

        AND EXISTS (

            SELECT

                1

            FROM

                t_cms_info ci

            WHERE

                ci.ALIVE_FLAG = '1'

            AND ci.ID = br.INFORMATION_ID

            AND ci.CHANNEL_ID = cs.ID

        )

        AND date_format(br.CREATE_DATE, '%Y%m') = date_format(NOW(), '%Y%m')

    ) AS monthBrowse

FROM

    t_cms_channel_sub cs

WHERE

    cs.ALIVE_FLAG = '1'

AND EXISTS (

    SELECT

        1

    FROM

        t_cms_channel_m cm

    WHERE

        cm.ALIVE_FLAG = '1'

    AND cm.ID = cs.CHANNEL_M_ID

    AND cm.CHANNEL_M_DESC = 'ZX'

)

UNION

    SELECT

        '山东专栏' AS name,

        (

            SELECT

                COUNT(br.ID)

            FROM

                t_cms_browsing_record br

            WHERE

                br.ALIVE_FLAG = '1'

            AND EXISTS (

                SELECT

                    1

                FROM

                    t_cms_info ci

                WHERE

                    ci.ALIVE_FLAG = '1'

                AND ci.ID = br.INFORMATION_ID

                AND ci.CHANNEL_ID IN (

                    SELECT

                        cs.ID

                    FROM

                        t_cms_channel_sub cs

                    WHERE

                        cs.ALIVE_FLAG = '1'

                    AND EXISTS (

                        SELECT

                            1

                        FROM

                            t_cms_channel_m cm

                        WHERE

                            cm.ALIVE_FLAG = '1'

                        AND cm.ID = cs.CHANNEL_M_ID

                        AND cm.CHANNEL_M_DESC = 'SDZL'

                    )

                )

            )

            AND date_format(br.CREATE_DATE, '%Y%m') = date_format(NOW(), '%Y%m')

        ) AS monthBrowse

    FROM

        DUAL

    UNION

        SELECT

            '月度报告' AS name,

            (

                SELECT

                    COUNT(br.ID)

                FROM

                    t_cms_browsing_record br

                WHERE

                    br.ALIVE_FLAG = '1'

                AND EXISTS (

                    SELECT

                        1

                    FROM

                        t_cms_info ci

                    WHERE

                        ci.ALIVE_FLAG = '1'

                    AND ci.ID = br.INFORMATION_ID

                    AND ci.EXTEND3 = 'month'

                    AND ci.EXTEND10 = 'zh'

                )

                AND date_format(br.CREATE_DATE, '%Y%m') = date_format(NOW(), '%Y%m')

            ) AS monthBrowse

        FROM

            DUAL)as oriInfo order by monthBrowse DESC

<font size = 3>&nbsp;&nbsp; 13.sql实例--嵌套条件

SELECT COUNT(*) FROM contract

WHERE buyer NOT IN (

    SELECT member_id FROM `crude-trade-member`.enterprises

        WHERE full_name LIKE '%中化%'

        OR full_name LIKE '%SINOCHEM%'

)

AND seller NOT IN (

    SELECT member_id FROM `crude-trade-member`.enterprises

        WHERE full_name LIKE '%中化%'

        OR full_name LIKE '%SINOCHEM%'

); -- 第三方交易(笔数)

“`

小结

  有一个sql写的特别长,感觉有些不合理,执行起来会很慢 ,但是需求是这样的,目前我先写成了这样,还好并发不大。

猜你喜欢

转载自blog.csdn.net/boniesunshine/article/details/80020247