Обновление с 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;