mysql多个left join连接查询用法分析

本文实例讲述了mysql多个left join连接查询用法。分享给大家供大家参考,具体如下:

mysql查询时需要连接多个表时,比如查询订单的商品表,需要查询商品的其他信息,其他信息不在订单的商品表,需要连接其他库的表,但是连接的条件基本都是商品ID就可以了,先给一个错误语句(查询之间的嵌套,效率很低):

SELECT
  A.order_id,
  A.wid,
  A.work_name,
  A.supply_price,
  A.sell_price,
  A.total_num,
  A.sell_profit,
  A.sell_percent,
  A.goods_id,
  A.goods_name,
  A.classify,
  B.gb_name
FROM
  (
    SELECT
      A.sub_order_id AS order_id,
      A.photo_id AS wid,
      A.photo_name AS work_name,
      A.supply_price,
      A.sell_price,
      sum(A.num) AS total_num,
      (
        A.sell_price - A.supply_price
      ) AS sell_profit,
      (
        A.sell_price - A.supply_price
      ) / A.sell_price AS sell_percent,
      A.goods_id,
      A.goods_name,
      B.goods_name AS classify
    FROM
      order_goods AS A
    LEFT JOIN (
      SELECT
        A.goods_id,
        A.parentid,
        B.goods_name
      FROM
        test_qyg_goods.goods AS A
      LEFT JOIN test_qyg_goods.goods AS B ON A.parentid = B.goods_id
    ) AS B ON A.goods_id = B.goods_id
    WHERE
      A.createtime >= '2016-09-09 00:00:00'
    AND A.createtime <= '2016-10-16 23:59:59'
    AND FROM_UNIXTIME(
      UNIX_TIMESTAMP(A.createtime),
      '%Y-%m-%d'
    ) != '2016-09-28'
    AND FROM_UNIXTIME(
      UNIX_TIMESTAMP(A.createtime),
      '%Y-%m-%d'
    ) != '2016-10-07'
    GROUP BY
      A.photo_id
    ORDER BY
      A.goods_id ASC
  ) AS A
LEFT JOIN (
  SELECT
    A.wid,
    A.brand_id,
    B.gb_name
  FROM
    test_qyg_user.buser_goods_list AS A
  LEFT JOIN test_qyg_supplier.brands AS B ON A.brand_id = B.gbid
) AS B ON A.wid = B.wid

查询结果耗时4秒多,explain分析,发现其中2个子查询是全部扫描,可以使用mysql的多个left join优化

SELECT
  A.sub_order_id,
  A.photo_id AS wid,
  A.photo_name AS work_name,
  A.supply_price,
  A.sell_price,
  sum(A.num) AS total_num,
  (
    A.sell_price - A.supply_price
  ) AS sell_profit,
  (
    A.sell_price - A.supply_price
  ) / A.sell_price AS sell_percent,
  A.goods_id,
  A.goods_name,
  B.parentid,
  C.goods_name AS classify,
  D.brand_id,
  E.gb_name,
  sum(
    CASE
    WHEN F.buy_type = 'yes' THEN
      A.num
    ELSE
      0
    END
  ) AS total_buy_num,
  sum(
    CASE
    WHEN F.buy_type = 'yes' THEN
      A.num
    ELSE
      0
    END * A.sell_price
  ) AS total_buy_money,
  sum(
    CASE
    WHEN F.buy_type = 'no' THEN
      A.num
    ELSE
      0
    END
  ) AS total_give_num,
  sum(
    CASE
    WHEN F.buy_type = 'no' THEN
      A.num
    ELSE
      0
    END * A.sell_price
  ) AS total_give_money
FROM
  order_goods AS A
LEFT JOIN test_qyg_goods.goods AS B ON A.goods_id = B.goods_id
LEFT JOIN test_qyg_goods.goods AS C ON B.parentid = C.goods_id
LEFT JOIN test_qyg_user.buser_goods_list AS D ON A.photo_id = D.wid
LEFT JOIN test_qyg_supplier.brands AS E ON D.brand_id = E.gbid
LEFT JOIN order_info_sub AS F ON A.sub_order_id = F.order_id
WHERE
  A.createtime >= '2016-09-09 00:00:00'
AND A.createtime <= '2016-10-16 23:59:59'
AND FROM_UNIXTIME(
  UNIX_TIMESTAMP(A.createtime),
  '%Y-%m-%d'
) != '2016-09-28'
AND FROM_UNIXTIME(
  UNIX_TIMESTAMP(A.createtime),
  '%Y-%m-%d'
) != '2016-10-07'
GROUP BY
  A.photo_id
ORDER BY
  A.goods_id ASC

查询结果耗时0.04秒

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

(0)

相关推荐

  • MySQL中对表连接查询的简单优化教程

    在MySQL中,A LEFT JOIN B join_condition执行过程如下: · 根据表A和A依赖的所有表设置表B. · 根据LEFT JOIN条件中使用的所有表(除了B)设置表A. · LEFT JOIN条件用于确定如何从表B搜索行.(换句话说,不使用WHERE子句中的任何条件). · 可以对所有标准联接进行优化,只是只有从它所依赖的所有表读取的表例外.如果出现循环依赖关系,MySQL提示出现一个错误. · 进行所有标准WHERE优化. · 如果A中有一行匹配WHERE子句,但B中没

  • mysql连接查询(左连接,右连接,内连接)

    一.mysql常用连接 INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录. mysql> select * from name_address; +----------+------+----+ | address | name | id | +----------+------

  • MySQL笔记之连接查询详解

    连接查询是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据 当不同的表中存在表示相同意义的字段时,可以通过该字段来连接这几张表 参考表:employee 参考表:department 可以看到,上面两张表都有同一个字段d_id 当两张表含有相同意义的字段(可以不同名)时就可以进行连接查询 内连接查询 复制代码 代码如下: mysql> SELECT num, name, employee.d_id, sex, d_name, function    -> FROM employee,

  • 经典mysql连接查询例题

    MySQL连接查询相信大家都有所了解,连接查询是在数据库查询操作的时候经常用到的,下面就为您介绍MySQL连接查询 mysql连接查询:支持多表连接 对同一张表可以重复连接多次(别名在多次连接同一张表时很重要) 例题1: 下面有2张表 teams表 比赛结果表:result 问题: 得出一张表:主队,客队,比赛成绩,比赛时间 方法一:子查询和连接查询混合   step1: 复制代码 代码如下: select result.id, t_name as h_name,match_time,resul

  • MySQL查询优化:连接查询排序浅谈

    情况是这么一个情况:现在有两张表,team表和people表,每个people属于一个team,people中有个字段team_id. 下面给出建表语句: 复制代码 代码如下: create table t_team(id int primary key,tname varchar(100)); create table t_people(id int primary key,pname varchar(100),team_id int,foreign key (team_id) referen

  • MySQL优化之使用连接(join)代替子查询

    使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从4.1开始支持SQL的子查询.这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中.例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,如下所示: DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FR

  • MySQL中基本的多表连接查询教程

    一.多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: 由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢.一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN 2.   内连接INNER JOIN 在MySQL中把I SELECT * FROM table1 CROSS JOIN tabl

  • Mysql自连接查询实例详解

    本文实例讲述了Mysql自连接查询.分享给大家供大家参考,具体如下: 自连接查询 假想以下场景:某一电商网站想要对站内产品做层级分类,一个类别下面有若干子类,子类下面也会有别的子类.例如数码产品这个类别下面有笔记本,台式机,智能手机等:笔记本,台式机,智能手机又可以按照品牌分类:品牌又可以按照价格分类,等等.也许这些分类会达到一个很深的层次,呈现一种树状的结构.那么这些数据要怎么在数据库中表示呢?我们可以在数据库中创建两个字段来存储id和类别名称,使用第三个字段存储类别的子类或者父类的id,最后

  • MySQL查询优化:用子查询代替非主键连接查询实例介绍

    一对多的两张表,一般是一张表的外键关联到另一个表的主键.但也有不一般的情况,也就是两个表并非通过其中一个表的主键关联. 例如: 复制代码 代码如下: create table t_team ( tid int primary key, tname varchar(100) ); create table t_people ( pid int primary key, pname varchar(100), team_name varchar(100) ); team表和people表是一对多的关

  • 详解MySQL中的分组查询与连接查询语句

    分组查询 group by group by 属性名 [having 条件表达式][ with rollup] "属性名 "指按照该字段值进行分组:"having 条件表达式 "用来限制分组后的显示,满足条件的结果将被显示:with rollup 将会在所有记录的最后加上一条记录,该记录是上面所有记录的总和. 1)单独使用 group by 单独使用,查询结果只显示一个分组的一条记录. 实例: select * from employee group by sex;

  • mysql多表连接查询实例讲解

    实际的项目,存在多张表的关联关系.不可能在一张表里面就能检索出所有数据.如果没有表连接的话,那么我们就需要非常多的操作.比如需要从A表找出限制性的条件来从B表中检索数据.不但需要分多表来操作,而且效率也不高.比如书中的例子: 代码如下: SELECT FId FROM T_Customer WHERE FName='MIKE' 这个SQL语句返回2,也就是姓名为MIKE 的客户的FId值为2,这样就可以到T_Order中检索FCustomerId等于2 的记录: 代码如下: SELECT FNu

  • MySQL连接查询实例详解

    本文实例讲述了MySQL连接查询.分享给大家供大家参考,具体如下: 创建表suppliers: CREATE TABLE suppliers ( s_id int NOT NULL AUTO_INCREMENT, s_name char(50) NOT NULL, s_city char(50) NULL, s_zip char(10) NULL, s_call CHAR(50) NOT NULL, PRIMARY KEY (s_id) ) ; INSERT INTO suppliers(s_i

随机推荐