视递美食网
您的当前位置:首页mysql多个leftjoin连接查询用法分析

mysql多个leftjoin连接查询用法分析

来源:视递美食网


本文实例讲述了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数据库计有所帮助。

您可能感兴趣的文章:

  • MySQL中基本的多表连接查询教程
  • 详解MySQL中的分组查询与连接查询语句
  • mysql连接查询(左连接,右连接,内连接)
  • MySQL查询优化:连接查询排序浅谈
  • MySQL笔记之连接查询详解
  • MySQL优化之使用连接(join)代替子查询
  • MySQL查询优化:用子查询代替非主键连接查询实例介绍
  • 经典mysql连接查询例题
  • MySQL中对表连接查询的简单优化教程
  • mysql多表连接查询实例讲解
  • MySQL连接查询实例详解
  • Mysql自连接查询实例详解
  • 显示全文