我有三個表,products
,variants
和data
。MySQL查詢:當使用ifnull連接表時響應慢
每個產品都有自己的productcode
。產品可以有任何數量的變體,包括無。變體有自己的代碼variantcode
。產品列有productid
列,每個變體都有相關的productid
列。
我想要一個所有代碼的列表,但如果產品沒有變體,我只關心productcode
。否則,我想要variantcode
。我寫了這個查詢來得到這個列表:
SELECT IFNULL(variants.variantcode, products.productcode) AS code
FROM products
LEFT OUTER JOIN variants ON (products.productid = variants.productid)
ORDER BY code
這個查詢按我的預期工作。
data
表包含每個代碼的額外數據。我想將這些數據加入到這個列表中。我想這個查詢:
SELECT IFNULL(variants.variantcode, products.productcode) AS code
FROM products
LEFT OUTER JOIN variants ON (products.productid = variants.productid)
LEFT OUTER JOIN data ON (data.partno = code)
ORDER BY code
但我「在‘關於條款’未知列‘代碼’」得到一個錯誤。我以爲這已經是與code
是一個生成的值,所以後來我嘗試此查詢:
SELECT IFNULL(variants.variantcode, products.productcode) AS code
FROM products
LEFT OUTER JOIN variants ON (products.productid = variants.productid)
LEFT OUTER JOIN data ON (data.partno = IFNULL(variants.variantcode, products.productcode))
ORDER BY code
這個查詢工作,但花了很長時間(〜20秒VS < 1秒第一個查詢) 。 ON子句中的IFNULL是否是問題?我如何加快速度?
你需要使用一個派生查詢此。 – Kermit