ОБНОВЛЕНИЕ с ORDER BY и LIMIT не работает в MYSQL - PullRequest
11 голосов
/ 31 января 2012

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

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

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

Неправильное использование UPDATE и LIMIT

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

Ответы [ 5 ]

17 голосов
/ 31 января 2012

Обычно вы можете использовать LIMIT и ORDER в ваших UPDATE заявлениях, но в вашем случае нет, как написано в MySQL Documentation 12.2.10. ОБНОВЛЕНИЕ Синтаксис :

Для синтаксиса с несколькими таблицами UPDATE обновляет строки в каждой таблице с именем в 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
)
7 голосов
/ 28 августа 2015

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

UPDATE Ratemaster, Rates 
SET Ratemaster.Rate=Rates.Rate 
WHERE Ratemaster.user=Rates.user 
ORDER BY Rates.id
LIMIT 1
1 голос
/ 31 января 2012

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

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

0 голосов
/ 22 января 2019

Work It 100%

UPDATE table  SET Sing='p'  ORDER BY sr_no  LIMIT 10;  
0 голосов
/ 31 января 2012

Проблема в том, что 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

Чтобы извлечь все строки с определенного смещения до конца набора результатов, вы можете использовать некоторое большое число для второго параметра.Этот оператор извлекает все строки из 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 ОТ 'ВЫБРАТЬ * ОТ ТАБЛИЦЫ LIMIT?';EXECUTE STMT USING @a;

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

SET @ skip = 1;SET @ numrows = 5;ПОДГОТОВИТЬ STMT ОТ 'ВЫБРАТЬ * ИЗ ТАБЛИЦЫ LIMIT?,?';EXECUTE STMT USING @skip, @numrows;

Для совместимости с PostgreSQL MySQL также поддерживает синтаксис смещения LIMIT row_count OFFSET.

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

(SELECT ... LIMIT 1) LIMIT 2;

...