【问题标题】:MySQL - can I avoid these correlated / dependant subqueries?MySQL - 我可以避免这些相关/依赖的子查询吗?
【发布时间】:2014-12-04 08:41:23
【问题描述】:

我有一个我一直在优化的 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 知识有限的情况下......

【问题讨论】:

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

标签: mysql optimization subquery mysql-dependent-subquery


【解决方案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';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多