Запросик MySQL: Update с вложенным Select .. From .. Limit 1

Слава Шевцов
На сайте с 23.07.2005
Offline
370
10031

Есть таблица slices, в которой хранятся копии HTML-страниц на разные моменты времени. Страниц много, на каждую страниц "копий" тоже много. Время создания последних версий разных страниц разбросано случайным образом. Для скорости работы хочу время от времени сбрасывать последнюю по времени версию каждой страницы в таблицу cache и уже при запросе страницы забирать оттуда. Для этого построил в MySQL5 такой вот запрос:


/**
* Описание полей:
* text_id - идентификатор страницы
* html - контент страницы
* timestamp - метка времени
*/

UPDATE
cache,
(
SELECT
text_id,
html,
timestamp
FROM
slices
ORDER BY
timestamp DESC
LIMIT 1
) AS slices
SET
cache.html = slices.html,
cache.timestamp = slices.timestamp /* пригодится ниже */
WHERE
cache.text_id = slices.text_id
AND
cache.timestamp < slices.timestamp /* избегаем повторного копирования данных */

Запрос, зараза, выдаёт ноль затронутых при обновлении строк. При этом строки с нужными text_id есть в обеих таблицах. Изначально во всех строках таблицы cache поле timestamp равно "0000-00-00 00:00:00". Как переписать запрос правильно?

Неизменность точки зрения неизменно порождает иллюзию понимания.
Ghost Bear
На сайте с 01.07.2009
Offline
28
#1

Навскидку: Попробуй разбить на несколько более простых запросов, пересмотри логику и если работает, постепенно собери обратно в сложный. Смущает меня select внутри.

Пишу продвинутый веб-софт и автоматизирую сео-задачи на партнёрских условиях. Ваша тема + Мой код = Совместный успех. Велком в ЛС.
Слава Шевцов
На сайте с 23.07.2005
Offline
370
#2

Ghost Bear, меня тоже смущает SELECT. Насколько видится, там из таблицы slices извлекается одна запись и вот она пытается соединиться с записями таблицы cache по условию WHERE. Как в этом SELECT отобрать по одной последней записи для каждого text_id - не понимаю.

Dreammaker
На сайте с 20.04.2006
Offline
569
#3

Слава Шевцов, дайте плиз небольшой дамп для того чтобы поиграться. Вроде бы и мало там, но лень таблицы делать и набивать :)

N
На сайте с 06.05.2007
Offline
419
#4

ну и что такого? сделайте в скобочках еще один подзапрос на выборку актуальных данных :


UPDATE
cache,
(
SELECT
slices.text_id, slices.html, slices.timestamp
FROM
slices,
(SELECT
text_id, MAX(timestamp) maxtimestamp
FROM
slices
GROUP BY
text_id
) AS mslices
WHERE
slices.text_id = mslices.text_id AND slices.timestamp = mslices.maxtimestamp
) AS slices
SET
cache.html = slices.html, cache.timestamp = slices.timestamp
WHERE
cache.text_id = slices.text_id
AND cache.timestamp < slices.timestamp;

данные кое-как сам набил. возможно, я вообще неправильно понял смысл. так что выложите дамп.

Кнопка вызова админа ()
Слава Шевцов
На сайте с 23.07.2005
Offline
370
#5

netwind, спасибо, помогло.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий