• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
123456825 显示全部楼层 发表于 2021-10-26 13:57:57 |阅读模式 打印 上一主题 下一主题
本文实例陈诉了mysql多个left join毗连查询用法。分享给各人供各人参考,详细如下:
mysql查询时需要毗连多个表时,好比查询订单的商品表,需要查询商品的其他信息,其他信息不在订单的商品表,需要毗连其他库的表,但是毗连的条件根本都是商品ID就可以了,先给一个错误语句(查询之间的嵌套,效率很低):
  1. SELECT
  2.   A.order_id,
  3.   A.wid,
  4.   A.work_name,
  5.   A.supply_price,
  6.   A.sell_price,
  7.   A.total_num,
  8.   A.sell_profit,
  9.   A.sell_percent,
  10.   A.goods_id,
  11.   A.goods_name,
  12.   A.classify,
  13.   B.gb_name
  14. FROM
  15.   (
  16.     SELECT
  17.       A.sub_order_id AS order_id,
  18.       A.photo_id AS wid,
  19.       A.photo_name AS work_name,
  20.       A.supply_price,
  21.       A.sell_price,
  22.       sum(A.num) AS total_num,
  23.       (
  24.         A.sell_price - A.supply_price
  25.       ) AS sell_profit,
  26.       (
  27.         A.sell_price - A.supply_price
  28.       ) / A.sell_price AS sell_percent,
  29.       A.goods_id,
  30.       A.goods_name,
  31.       B.goods_name AS classify
  32.     FROM
  33.       order_goods AS A
  34.     LEFT JOIN (
  35.       SELECT
  36.         A.goods_id,
  37.         A.parentid,
  38.         B.goods_name
  39.       FROM
  40.         test_qyg_goods.goods AS A
  41.       LEFT JOIN test_qyg_goods.goods AS B ON A.parentid = B.goods_id
  42.     ) AS B ON A.goods_id = B.goods_id
  43.     WHERE
  44.       A.createtime >= '2016-09-09 00:00:00'
  45.     AND A.createtime <= '2016-10-16 23:59:59'
  46.     AND FROM_UNIXTIME(
  47.       UNIX_TIMESTAMP(A.createtime),
  48.       '%Y-%m-%d'
  49.     ) != '2016-09-28'
  50.     AND FROM_UNIXTIME(
  51.       UNIX_TIMESTAMP(A.createtime),
  52.       '%Y-%m-%d'
  53.     ) != '2016-10-07'
  54.     GROUP BY
  55.       A.photo_id
  56.     ORDER BY
  57.       A.goods_id ASC
  58.   ) AS A
  59. LEFT JOIN (
  60.   SELECT
  61.     A.wid,
  62.     A.brand_id,
  63.     B.gb_name
  64.   FROM
  65.     test_qyg_user.buser_goods_list AS A
  66.   LEFT JOIN test_qyg_supplier.brands AS B ON A.brand_id = B.gbid
  67. ) AS B ON A.wid = B.wid
复制代码
查询结果耗时4秒多,explain分析,发现此中2个子查询是全部扫描,可以利用mysql的多个
  1. left join
复制代码
优化
  1. SELECT
  2.   A.sub_order_id,
  3.   A.photo_id AS wid,
  4.   A.photo_name AS work_name,
  5.   A.supply_price,
  6.   A.sell_price,
  7.   sum(A.num) AS total_num,
  8.   (
  9.     A.sell_price - A.supply_price
  10.   ) AS sell_profit,
  11.   (
  12.     A.sell_price - A.supply_price
  13.   ) / A.sell_price AS sell_percent,
  14.   A.goods_id,
  15.   A.goods_name,
  16.   B.parentid,
  17.   C.goods_name AS classify,
  18.   D.brand_id,
  19.   E.gb_name,
  20.   sum(
  21.     CASE
  22.     WHEN F.buy_type = 'yes' THEN
  23.       A.num
  24.     ELSE
  25.       0
  26.     END
  27.   ) AS total_buy_num,
  28.   sum(
  29.     CASE
  30.     WHEN F.buy_type = 'yes' THEN
  31.       A.num
  32.     ELSE
  33.       0
  34.     END * A.sell_price
  35.   ) AS total_buy_money,
  36.   sum(
  37.     CASE
  38.     WHEN F.buy_type = 'no' THEN
  39.       A.num
  40.     ELSE
  41.       0
  42.     END
  43.   ) AS total_give_num,
  44.   sum(
  45.     CASE
  46.     WHEN F.buy_type = 'no' THEN
  47.       A.num
  48.     ELSE
  49.       0
  50.     END * A.sell_price
  51.   ) AS total_give_money
  52. FROM
  53.   order_goods AS A
  54. LEFT JOIN test_qyg_goods.goods AS B ON A.goods_id = B.goods_id
  55. LEFT JOIN test_qyg_goods.goods AS C ON B.parentid = C.goods_id
  56. LEFT JOIN test_qyg_user.buser_goods_list AS D ON A.photo_id = D.wid
  57. LEFT JOIN test_qyg_supplier.brands AS E ON D.brand_id = E.gbid
  58. LEFT JOIN order_info_sub AS F ON A.sub_order_id = F.order_id
  59. WHERE
  60.   A.createtime >= '2016-09-09 00:00:00'
  61. AND A.createtime <= '2016-10-16 23:59:59'
  62. AND FROM_UNIXTIME(
  63.   UNIX_TIMESTAMP(A.createtime),
  64.   '%Y-%m-%d'
  65. ) != '2016-09-28'
  66. AND FROM_UNIXTIME(
  67.   UNIX_TIMESTAMP(A.createtime),
  68.   '%Y-%m-%d'
  69. ) != '2016-10-07'
  70. GROUP BY
  71.   A.photo_id
  72. ORDER BY
  73.   A.goods_id ASC
复制代码
查询结果耗时0.04秒
更多关于MySQL相干内容感兴趣的读者可检察本站专题:《MySQL常用函数大汇总》、《MySQL日志操纵本领大全》、《MySQL变乱操纵本领汇总》、《MySQL存储过程本领大全》及《MySQL数据库锁相干本领汇总》
盼望本文所述对各人MySQL数据库计有所资助。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作