MySQL - 我可以避免这些相关/依赖子查询吗?

时间:2014-10-09 12:08:01

标签: mysql optimization subquery mysql-dependent-subquery

我有一个我一直在优化的MySQL查询,目前它有2个依赖/相关子查询。

我想知道是否可以重写以避免这些?

SELECT *
FROM `pp_slides` 
JOIN `pp_slide_content` 
    ON `pp_slides`.`id` = `pp_slide_content`.`slide_id` 
    AND `pp_slide_content`.`version` = (
        SELECT max(`version`) FROM `pp_slide_content` WHERE `slide_id` = `pp_slides`.`id`
    )

LEFT JOIN `pp_published_slides` 
    ON `pp_published_slides`.`slide_id` = `pp_slides`.`id` 
    AND `pp_published_slides`.`slide_version` = `pp_slide_content`.`version` 
    AND `pp_published_slides`.`publish_id` = (
        SELECT max(`publish_id`) FROM `pp_published_slides` WHERE `pp_published_slides`.`slide_id` = `pp_slides`.`id` AND `pp_published_slides`.`slide_version` = `pp_slide_content`.`version`
    ) 


LEFT JOIN `pp_publish` ON `pp_publish`.`id` = `publish_id`

WHERE `pp_slides`.`product_id` =  '2'
AND `pp_slides`.`country_code` =  'gb'

快速概述: 创建幻灯片,并支持版本化更改。 然后发布幻灯片(和其他实体)。 幻灯片和发布的版本在pp_published_slides表中设置。 整个发布对象保存在pp_publish中。

上述SQL将加载一个幻灯片对象,并包含有关最新版本的额外数据,发布时等。

这是一个sqlfiddle http://sqlfiddle.com/#!2/902fb4/1

非常感谢任何帮助,有点在我的SQL知识的极限....

1 个答案:

答案 0 :(得分:1)

这是一个示例,显示在没有相关子查询的情况下重写了部分查询...

SELECT s.*
     , c.*
  FROM slides s  
  JOIN slide_content c
    ON c.slide_id = s.id
  JOIN ( SELECT slide_id, MAX(version) max_version FROM slide_content GROUP BY slide_id ) x
    ON x.slide_id = c.slide_id
   AND x.max_version = c.version 
 WHERE s.product_id = 2
   AND s.country_code = 'gb';