Обновление с ORDER BY и LIMIT не работает в MYSQL

Я новичок в MYSQL и не могу решить или даже с таким количеством ответов на этом форуме, не в состоянии идентифицировать ошибку в этом заявлении. Я использую базу данных MYSQL.

у меня есть 2 таблицы: Ratemaster и ставки, в которых клиент может иметь 1 продукт с разными ставками. Из-за этого происходит дублирование полей клиент и продукт, изменяется только поле ставка. Теперь таблица Ratemaster имеет все поля: id, код клиента, продукт, ставка, пользователь в то время как ставки таблица только: id, код cust, тариф, потребитель. - поле "пользователь" для проверки и session_user.

Теперь таблица Ratemaster имеет 3 записи со всеми значениями полей одинаковыми, кроме поля скорости пустым. Таблица ставок имеет разные ставки. Я хочу, чтобы все ставки обновлялись в Ratemaster из таблицы ставок. Я не могу сделать это с помощью UPDATE и LIMIT команда mysql, она дает ошибку как:

неправильное использование обновления и ограничения

UPDATE Ratemaster, Rates 
SET Ratemaster.Rate=Rates.Rate 
WHERE Ratemaster.user=Rates.user 
LIMIT 1

4 ответов


обычно вы можете использовать LIMIT и ORDER в своем UPDATE заявления, но в вашем случае нет, как написано в Документация MySQL 12.2.10. Обновить синтаксис:

для синтаксиса нескольких таблиц обновление обновляет строки в каждой таблице с именем в table_references, которые удовлетворяют условиям. В этом случае порядок BY и LIMIT нельзя использовать.

попробуйте следующее:

UPDATE Ratemaster
SET Ratemaster.Rate =
(
    SELECT Rates.Rate
    FROM Rates
    WHERE Ratemaster.user = Rates.user
    ORDER BY Rates.id
    LIMIT 1
)

Салям Вы можете использовать этот метод и работать правильно !

UPDATE Ratemaster, Rates 
SET Ratemaster.Rate=Rates.Rate 
WHERE Ratemaster.user=Rates.user 
ORDER BY Rates.id
LIMIT 1

читать статьи о Как использовать ORDER BY и LIMIT на обновлениях нескольких таблиц в MySQL

для синтаксиса нескольких таблиц обновление обновляет строки в каждой таблице с именем в table_references, которые удовлетворяют условиям. В этом случае порядок BY и LIMIT нельзя использовать.


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

From:http://dev.mysql.com/doc/refman/5.5/en/select.html

предложение Limit может использоваться для ограничения количества строк, возвращаемых инструкция Select. LIMIT принимает один или два числовых аргумента, которые оба должны быть неотрицательными целыми константами, за исключением:

Within prepared statements, LIMIT parameters can be specified using ? placeholder markers.

Within stored programs, LIMIT parameters can be specified using integer-valued routine parameters or local variables as of MySQL 5.5.6.

С двумя аргументами, первый аргумент задает смещение первая строка для возврата, а вторая задает максимальное число строки для возврата. Смещение начальной строки равно 0 (не 1):

SELECT * FROM TBL LIMIT 5,10; # получить строки 6-15

чтобы получить все строки с определенного смещения и до конца результата set, вы можете использовать некоторое большое число для второго параметра. Этот оператор извлекает все строки из 96-й строки в последнее:

SELECT * FROM TBL LIMIT 95,18446744073709551615;

С одним аргументом, значение указывает количество возвращаемых строк с начала результирующего набора:

SELECT * FROM TBL LIMIT 5; # получить первые 5 строк

другими словами, LIMIT row_count эквивалентен LIMIT 0, row_count.

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

SET @a=1; Подготовьте STMT от " SELECT * FROM TBL LIMIT ?'; ВЫПОЛНИТЬ STMT Используя @а;

следующие операторы вернут вторую-шестую строку из таблица tbl:

SET @skip=1; SET @numrows=5; Подготовьте STMT из ' SELECT * из tbl Предел ?, ?'; Выполнить STMT с помощью @skip, @numrows;

для совместимости с PostgreSQL MySQL также поддерживает ограничение синтаксис смещения ROW_COUNT OFFSET.

если ограничение происходит в подзапросе, а также применяется во внешнем запрос, внешний предел имеет приоритет. Например, следующий оператор создает две строки, а не одну:

(SELECT ... ПРЕДЕЛ 1) ПРЕДЕЛ 2;