2014-10-09 2 views
0

У меня есть запрос MySQL, который я оптимизировал, и в настоящее время он имеет 2 зависимых/коррелированных подзапроса.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 будет загрузить объект слайда, и включают в себя дополнительные данные о последней версии, когда она была опубликована и т.д.

Вот sqlfiddle http://sqlfiddle.com/#!2/902fb4/1

Любая помощь будет принята с благодарностью, своего рода в пределах моего SQL знания ....

+0

Matt, пожалуйста, обновите то, что вы хотите достичь, то есть какой результат вы хотите получить от этих запросов. Так что может быть совсем другой способ. – Akhil

+0

Не используйте «SELECT *». Назовите и правильно квалифицируйте каждый из столбцов, которые вы действительно хотите вернуть. – Strawberry

+1

Помимо этого, они кажутся двумя разными запросами. Вы уверены, что законно объединить их как один? Если да, тогда рассмотрите следующий простой двухэтапный курс действий: 1. Если вы еще этого не сделали, укажите надлежащие DDL (и/или sqlfiddle), чтобы мы могли более легко реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый результирующий набор, соответствующий информации, представленной на шаге 1. – Strawberry

ответ

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'; 
Смежные вопросы