if条件用于连接查询

时间:2013-12-21 11:13:39

标签: mysql performance query-performance

SELECT tm.MAGAZINE_ID, tm.publisher_id, tu.begin_date, tu.report_from,
units `MAGAZINE_NAME`
FROM `tbl_itunes_report` tu 
LEFT JOIN tbl_magazine_subscription_dtl tsd 
  ON tsd.subscription_key = tu.sku_key 
  AND ((tu.begin_date >= tsd.start_date 
  AND tu.begin_date < tsd.end_date) OR (tu.begin_date >= tsd.start_date 
  AND tsd.end_date = '0000-00-00')) 
LEFT JOIN tbl_magazine_subscription ts 
  ON ts.magazine_subscription_id = tsd.subs_id 
LEFT JOIN tbl_magazine_issue ti 
  ON ti.PurchaseKey = tu.sku_key AND ti.OS_SELECT = 0 
LEFT JOIN tbl_magazine tm 
  ON tm.magazine_id = ts.magazine_id OR tm.magazine_id =  ti.magazine_id 
WHERE `product_type_identifier` LIKE 'IA%' 
  AND ( tsd.subscription_key IS NOT NULL OR ti.PurchaseKey IS NOT NULL ) 
GROUP BY tm.MAGAZINE_ID,tsd.no_of_issues 
ORDER BY tm.magazine_name, tsd.no_of_issues

使用此查询,我将生成我的报告。它有4个连接。 在tbl_magazine_subscription_dtl的情况下,tbl_magazine_issue使用sku_key字段进行加入。 sku_key值一次只出现在一个表中,但加入将导致查询速度降低。是否可以在执行连接之前检查是否存在sku_key

1 个答案:

答案 0 :(得分:0)

我不完全理解您的问题,您是否只想要sku_key不为空并且同时出现在tbl_magazine_issuetbl_magazine_subscription_dtl中的行?在这种情况下,您应该在tbl_magazine_issue上执行内连接而不是左外连接,并在AND tu.sku_key IS NOT NULL子句中添加WHERE。查询引擎应足够智能,以便在加入之前应用此条件。

如果您担心此次加入的效果,还应确保将sku_keyPurchaseKey编入索引。