Возможно ли сделать выбор в выражении IF в ON DUPLICATE KEY UPDATE?MySQL Sub-select в ON DUPLICATE KEY
Скажем, я хочу установить тарифы доставки по почтовому индексу, а в случае ввода двойного почтового индекса я хочу применить самую высокую ставку для применения.
В моей базе данных есть таблица тарифов на доставку и таблица почтовых индексов. В таблице zip-кода имеется внешний ключ, указывающий скорость доставки, и почтовый индекс с уникальным индексом.
Если есть дубликат ключа, я хочу установить идентификатор скорости доставки для более высокой скорости. Что-то вроде этого:
INSERT INTO ZipCodes (ShippingRateID, Zip) VALUES (11, '13754') ON DUPLICATE KEY UPDATE ShippingRateID = IF((SELECT Rate FROM ShippingRates sr WHERE sr.ShippingRateID = ShippingRateID) > [current rate], ShippingRateID, VALUES(ShippingRateID))
Когда я пытаюсь выполнить этот запрос, MySQL говорит мне «Subquery вернулся более одной записи». Поскольку в таблице ShippingRates имеется только одна соответствующая запись, я не понимаю, как было возвращено более одной записи. На самом деле происходит то, что в подвыборке ShippingRateID всегда ссылается на таблицу ShippingRates, а значение ShippingRateID вставки не используется. Поэтому, не используя LIMIT, все тарифы доставки возвращаются. Если я использую LIMIT 1, тогда я всегда буду получать первую ставку, что неверно.
Как указать суб-выбор использовать ShippingRateID из вставки?
Как ваше обновление отличается от моего? – Yisroel
Он защищает от (бессмысленной) проблемы с несколькими рядами и позволяет извлекать значение ShippingRateID из таблицы. – chaos
Я проверил ваше обновление, оно всегда будет устанавливать максимальную скорость любого из тарифов на доставку, а не самую высокую из двух ставок, которые могут применяться. Я не понимаю, зачем нужен LIMIT вообще, когда предложение WHERE может соответствовать только одной строке. Если он соответствует нескольким строкам, то ясно, что ShippingRateID не будет правильно передан в подвыборку. – Yisroel