Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-我可以避免这些相关/依赖子查询吗?_Mysql_Optimization_Subquery_Mysql Dependent Subquery - Fatal编程技术网

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

MySQL-我可以避免这些相关/依赖子查询吗?,mysql,optimization,subquery,mysql-dependent-subquery,Mysql,Optimization,Subquery,Mysql Dependent Subquery,我有一个我一直在优化的MySQL查询,目前它有两个相关的子查询 我想知道是否有可能重写以避免这些 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_conten

我有一个我一直在优化的MySQL查询,目前它有两个相关的子查询

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

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将加载一个幻灯片对象,并包含有关最新版本的额外数据,如发布时间等

这是一把小提琴


如果您能提供任何帮助,我将不胜感激,尽管我的SQL知识有限……

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

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';

Matt请更新您希望实现的目标,即您希望从这些查询中得到什么结果。这样就可以有一种完全不同的方式。不要使用“选择*”。命名并正确限定您实际想要返回的每一列。除此之外,这似乎是两个不同的查询。你确定将它们合并为一个是合法的吗?如果是这样,那么考虑以下简单的两步行动:1。如果您还没有这样做,请提供适当的DDL(和/或SQLFIDLE),以便我们可以更轻松地复制问题。2.如果您还没有这样做,请提供与步骤1中提供的信息相对应的所需结果集。我不使用SELECT*,这是一个简化版本,用于稍后的post-ill更新,包含更多信息。使用SQLFIDLE和一些注释进行更新