Могу ли я использовать соединение вместо подзапроса, который возвращает 1 строку?

0

Вот мой запрос:

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 (вместо подзапроса). Является ли это возможным?

  • 0
    Можете ли вы отредактировать, чтобы включить некоторые примеры данных и ожидаемый результат?
  • 0
    Просто для информации, эти типы подзапросов называются скалярными подзапросами. Подзапрос - это скалярный подзапрос, который возвращает одно значение. Скалярный подзапрос
Теги:

3 ответа

1
Лучший ответ

Мы можем попробовать переписать, используя ряд дополнительных объединений:

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 строки.

  • 0
    Спасибо .. upvote
  • 0
    Пожалуйста, объясните ON p1.id = t2.post_parent LEFT JOIN wp_posts t2
Показать ещё 1 комментарий
1

Ты можешь использовать

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
  • 0
    Спасибо .. upvote
0

Попробуй это

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
  • 0
    Где post_image в вашем утверждении select ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню