Как я могу симулировать OFFSET в операторе MySQL UPDATE? - PullRequest
5 голосов
/ 01 февраля 2012

У меня есть таблица базы данных MySQL, которая содержит идентификатор статьи (первичный ключ) и заголовок статьи.Я хочу удалить дубликаты заголовков из таблицы, но сохраняю первое вхождение заголовка.Сначала я просто выполнил запрос для всех дублирующих заголовков:

SELECT
    title,
    count( id ) AS count
FROM articles
GROUP BY title
HAVING count > 1

Затем я заменил все дублирующиеся заголовки на пустые, используя цикл foreach, и эту команду:

UPDATE articles
SET title = ''
WHERE title = '$duplicate_title'

Я бынапример, обновить таблицу articles и заменить все повторяющиеся заголовки, кроме первой, на основе идентификатора статьи ASC, используя что-то подобное.Проблема в том, что OFFSET, похоже, не работает в ОБНОВЛЕНИИ.Есть ли способ сделать это в одном запросе?

UPDATE articles
SET title = ''
WHERE title = '$duplicate_title'
ORDER BY id ASC
OFFSET 1

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Я нашел другое решение, которое немного выходило за рамки моего первоначального вопроса, но, тем не менее, уместно.

У меня уже было количество дубликатов из первого запроса, который их нашел. Я вычел один из этого количества, затем упорядочил свой запрос UPDATE по идентификатору DESC, а затем ОГРАНИЧИЛ запрос на счет минус один. Это служит той же цели и удаляет все дубликаты, кроме первой записи.

Вот запрос ОБНОВЛЕНИЯ, который я использую:

UPDATE articles
SET title = ''
WHERE title = '$duplicate_title'
ORDER BY id DESC
LIMIT $duplicate_count_minus_one
1 голос
/ 01 февраля 2012
UPDATE articles a
INNER JOIN articles b
    ON a.title = b.title AND a.ID > b.ID
SET title = '';

Это в основном говорит

обновить все статьи, где существует соответствующая статья с таким же названием и меньшим идентификатором

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...