• mysql left join 左连接查询关联n多张表


    left join 左连接即以左表为基准,显示坐标所有的行,右表与左表关联的数据会显示,不关联的则不显示。关键字为left join on。 
    **基本用法如下: 

    select table a left join table b on a.id = b.ta_id**

    注意:
    其中on后面关联的字段应该是同一字段(两表关联的外键) 
    由于以左表为基准,左表一条记录如果对应右表多条记录,那查出的数据中右表的数据也只显示一条,如果要都显示,可以用group_contact()将字段用逗号隔开显示在一条记录上。所以右表不管有几张,如果和左表都是一对一关系,则没问题,存在一对多关系时,需要一定的处理。


    1、内连接:将两个表中存在连结关系的字段符合连接条件的记录形成记录集

    SELECT
        A. NAME,
        B. NAME
    FROM
        A
    INNER JOIN B ON A.id = B.id

    SELECT
        A. NAME,
        B. NAME
    FROM
        A,
        B
    WHERE
        A.id = B.id

    结果是一样的(内连接的inner关键字可省略);

    2、外连接:分为左外连接和右外连接

    左连接A、B表结果包括A的全部记录和符合条件的B的记录。

    右联结A、B表的结果和左联结B、A的结果是一样的,也就是说:

    SELECT
        A. NAME,
        B. NAME
    FROM
        A
    LEFT JOIN B ON A.id = B.id

    SELECT
        A. NAME,
        B. NAME
    FROM
        B
    RIGHT JOIN A ON B.id - A.id

    执行后的结果是一样的。

    3、全联结

    4、无联结

    5、三表联结查询

    SELECT
        username,
        psw,
        gname,
        tel
    FROM
        (
            t1
            LEFT JOIN t2 ON t1.t1_id = t2.t1_id
        )
    LEFT JOIN t3 ON t1.t1_id = t3.t1_id

    6、终极的三表联结查询

    items:商品表,item_visit_stats:商品访问表,item_trade_stats:商品销售表

    /*
    
    Source Server         : localhost
    Source Server Version : 50505
    Source Host           : localhost:3306
    Source Database       : test
    
    Target Server Type    : MYSQL
    Target Server Version : 50505
    File Encoding         : 65001
    
    Date: 2018-09-14 19:00:46
    */
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for items
    -- ----------------------------
    DROP TABLE IF EXISTS `items`;
    CREATE TABLE `items` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `title` varchar(255) DEFAULT '',
      `price` varchar(255) DEFAULT '',
      `nick` varchar(255) DEFAULT '',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
    
    -- ----------------------------
    -- Table structure for item_trade_stats
    -- ----------------------------
    DROP TABLE IF EXISTS `item_trade_stats`;
    CREATE TABLE `item_trade_stats` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `buyer_num` int(11) unsigned DEFAULT '0',
      `item_num` int(11) unsigned DEFAULT '0',
      `seller_nick` varchar(255) DEFAULT '',
      `business_day` datetime DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品销售表';
    
    -- ----------------------------
    -- Table structure for item_visit_stats
    -- ----------------------------
    DROP TABLE IF EXISTS `item_visit_stats`;
    CREATE TABLE `item_visit_stats` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `user_visits` varchar(255) NOT NULL,
      `business_day` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品访问表';



    SELECT
        i.id,
        i.title,
        SUM(ivs.user_visits) AS uv,
        its.item_num * i.price AS turnover
    FROM
        (
            items AS i
            RIGHT JOIN item_visit_stats AS ivs ON i.id = ivs.id
        )
    LEFT JOIN (
        SELECT
            id,
            SUM(item_num) AS item_num
        FROM
            item_trade_stats
        WHERE
            seller_nick = "XXXX"
        GROUP BY
            id
    ) AS its ON its.id = ivs.id
    WHERE
        i.nick = "XXXX"
    GROUP BY
        i.id
    ORDER BY
        uv DESC

    https://blog.csdn.net/chentaocba/article/details/7697825

    写的时候从外层往里写,一层一层left join,才不容易出错。


    http://www.cnblogs.com/amyStart/p/5965472.html




  • 相关阅读:
    live-server
    vue-插槽
    100%的背影
    Luogu P3243 菜肴制作
    CF512E Fox And Polygon
    BZOJ2523/LOJ2646 聪明的学生
    Luogu P3959 宝藏
    Luogu P2280 激光炸弹
    ACAG 0x02-8 非递归实现组合型枚举
    ACAG 0x02-4 费解的开关
  • 原文地址:https://www.cnblogs.com/softidea/p/6934950.html
Copyright © 2020-2023  润新知