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
查詢結(jié)果耗時4秒多,explain分析,發(fā)現(xiàn)其中2個子查詢是全部掃描,可以使用mysql的多個left join優(yōu)化
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
查詢結(jié)果耗時0.04秒
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲過程技巧大全》及《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》
希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信