Вот мой запрос:
SELECT p1.*,
(select guid
from wp_posts p2
where p2.post_parent = p1.id
ORDER by p2.id DESC
LIMIT 1) as post_image
from wp_posts p1
where p1.post_status = 'publish' and
p1.post_type = 'post'
order by p1.id DESC limit 4
Я хочу сделать тот же запрос, но используя join
(вместо подзапроса). Является ли это возможным?
Мы можем попробовать переписать, используя ряд дополнительных объединений:
SELECT
p1.*,
COALESCE(t2.guid, 'NA') AS post_image
FROM wp_posts p1
LEFT JOIN
(
SELECT post_parent, MAX(id) AS max_id
FROM wp_posts
GROUP BY post_parent
) t1
ON p1.id = t2.post_parent
LEFT JOIN wp_posts t2
ON t1.max_id = t2.id
WHERE p1.post_status = 'publish' AND p1.post_type = 'post'
ORDER BY p1.id DESC
LIMIT 4;
Логика, лежащая в основе вышеупомянутого рефакторинга, заключается в наблюдении, что ваш текущий подзапрос возвращает запись для каждого значения post_parent
, имеющего максимальное значение id
. Таким образом, мы можем присоединиться к подзапросу, который находит максимальное значение id
для каждой группы post_parent
. Затем нам нужно снова присоединиться к wp_posts
принести в guid
значения для этого максимум id
строки.
Ты можешь использовать
SELECT p1.*, p2.guid FROM
wp_posts as p1
JOIN wp_post AS p2 ON p2.post_parent = p1.id
AND p1.post_status = 'publish' AND p1.post_type = 'post'
ORDER by p1.id DESC limit 1
Попробуй это
SELECT p1.*
from wp_posts p1
left outer join(select guid
from wp_posts
where p2.post_parent = p1.id
ORDER by p2.id DESC
LIMIT 1) as post_image
where p1.post_status = 'publish' and
p1.post_type = 'post'
order by p1.id DESC limit 4
post_image
в вашем утверждении select
?