• Mysql-多个left join 计算逻辑


    单个left join:

    (1)一对一:结果表的行数=左表行数

    (2)一对多:结果表的行数>左表行数

    多个left join:

    (0)多个left join由上到下,依次生成查询表,原理同单个left join

    (1)需要补充的是,如果在left join a表之前,想先对a表做一个字段的筛选,不能在多个left join之后用where来条件过滤,因为,多个left join是优先于where执行的,如果用where是对多个left join之后的结果查询表进行的条件过滤。(这种很容造成结果错误,也就是结果数据不全)

    应该用,left join ON 后+"and"去先过滤

    a left join b ON a.id=b.id and a.isdel =0 b.status =1

       left join c ON a.id =c.id and c.type=3

    PS:有时候,单个left join、多个left join 需要跟select配合套多个"select马甲"使用,下边是一个很不错的常用模版套法:

    (一般对于不知道什么时候起别名 什么时候用括号的老铁们 真实头疼  所以发个模板,可以根据自己的需求,进行套用)

    https://www.cnblogs.com/LHWorldBlog/p/7753914.html

    不多说 直接上语句   
    SELECT
        a.id,
        a.thumbNail,
        a. NAME,
        a.marketPrice,
        a.memberPrice,
        a.personName,
        a. STATUS,
        a.recieveOrderDate,
        a.trackNumber,
        a.contact,
        a.reportSendDate,
        b.trackNumber,
        a.reportDownloadPath
    FROM
        (
            SELECT
                od.id,
                ps.thumbNail,
                ps. NAME,
                od.marketPrice,
                od.memberPrice,
                od.personName,
                od. STATUS,
                od.recieveOrderDate,
                ol.trackNumber,
                ol.contact,
                od.reportSendDate,
                od.reportSendOrderLogisticId,
                od.reportDownloadPath
            FROM
                orders.order_detail od
            LEFT JOIN orders.order_logistics ol ON od.recieveOrderLogisticId = ol.id
            LEFT JOIN orders.product_snapshot ps ON od.productSnapShotId = ps.id
            WHERE
                od.valid = TRUE
            AND ol.valid = TRUE
            AND od.orderId =?
        ) a
    LEFT JOIN (
        SELECT
            ol.trackNumber,
            od.id
        FROM
            orders.order_detail od
        LEFT JOIN orders.order_logistics ol ON od.reportSendOrderLogisticId = ol.id
        WHERE
            od.valid = TRUE
        AND ol.valid = TRUE
        AND od.orderId =?
    ) b ON a.id = b.id
    生活其实也很简单,喜欢的就去争取、得到的就珍惜、失去的就忘记。
  • 相关阅读:
    跟结束进程相关的那些信号
    tcpdump使用示例
    Linux在bash history当中添加timestamp
    CentOS中在/etc/rc.local添加开机自启动项启动失败
    CentOS配置通过DHCP的方式动态获取IP
    CentOS桌面安装
    MySQL二进制安装
    对okhttp参数的一些思考
    依赖倒置原则(DIP)
    Liskov替换原则(LSP)
  • 原文地址:https://www.cnblogs.com/Formulate0303/p/13992755.html
Copyright © 2020-2023  润新知