Существует таблица posts
, которые содержат данные, как показано ниже: (cover
столбец не имеет данных в настоящее время)
id title cover
-----------------------
1 title -
2 title -
И это моя таблица images
:
id url post_id
-----------------------
1 1.jpg 1
2 2.jpg 1
3 3.jpg 1
4 4.jpg 1
5 5.jpg 2
6 6.jpg 2
Я хочу перенести последнюю запись каждой группы в свой столбец в таблице posts
(последние записи должны быть удалены из таблицы images
и вставлены в таблицу posts
). Таким образом, запрос должен иметь возможность выполнить следующее:
id title cover
-----------------------
1 title 4.jpg
2 title 6.jpg
Для вашего ожидаемого результата вы можете использовать update join
чтобы сделать это,
update posts p
join (
select t1.post_id, t1.url
from images t1
join (
select max(id) max_id, post_id from images group by post_id
) t2 on t1.post_id = t2.post_id and t1.id = t2.max_id
) t on p.id = t.post_id
set p.cover = t.url
см. демо здесь.
Кроме того, если вы хотите удалить "последнее" изображение из images
таблицы, вы можете использовать delete
:
delete t1
from images t1
join (select max(id) max_id, post_id from images group by post_id) t2
on t1.post_id = t2.post_id
and t1.id = t2.max_id
Если вы хотите запустить эти два запроса в одном запросе, просто создайте procudure, включите эти два запроса.
Используя NOT EXISTS
получите строки с максимальным id
в таблице images
. Затем присоедините его к таблице posts
.
запрос
select t1.'id', t1.'title', t2.'url'
from 'posts' t1
join (
select 'id', 'url', 'post_id'
from 'images' t1
where not exists (
select 1 from 'images' t2
where t2.'post_id' = t1.'post_id'
and t2.'id' > t1.'id'
)
) t2
on t1.'id' = t2.'post_id';