Получение и перемещение последней записи в каждой группе

0

Существует таблица 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
Теги:

2 ответа

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

Для вашего ожидаемого результата вы можете использовать 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, включите эти два запроса.

  • 0
    Санки. Работало потрясающе: *
0

Используя 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';

Демо-версия скрипта

Ещё вопросы

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